利用iTextSharp.dll读取PDF到string、制作水印,图片转PDF

时间:2022-05-29 05:22:25

文字水印感觉有些问题,可能是字体的原因

图片水印的透明度设置无效

但勉强可以用

iTextSharp.dll版本5.2.1.0

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iTextSharp.text.pdf;
using iTextSharp.text;
using iTextSharp.text.pdf.parser;
using System.IO;

namespace ErrorCheckerForPDF
{
    public static class PvPDF
    {
      /// <summary>
      /// 读取PDF文件中的内容
      /// </summary>
      /// <param name="fn">文件名FullName</param>
      /// <returns></returns>
      public static string readPDF(this string fn)
      {
        //从一个对话框打开一个pdf文件,并创建一个读取该文件的PdfReader
        PdfReader reader = new PdfReader(fn);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        ITextExtractionStrategy strategy;
        strategy = parser.ProcessContent<SimpleTextExtractionStrategy>(1, new SimpleTextExtractionStrategy());
        return strategy.GetResultantText();
      }

      /// <summary>
      /// 创建一个显示指定图片的pdf
      /// </summary>
      /// <param name="picPdfPath"></param>
      /// <param name="picPath"></param>
      /// <returns></returns>
      public static bool CreatePDFByPic(string picPdfPath, string picPath)
      {
        //新建一个文档
        Document doc = new Document();
        try
        {
          //建立一个书写器(Writer)与document对象关联
          PdfWriter.GetInstance(doc, new FileStream(picPdfPath, FileMode.Create, FileAccess.ReadWrite));
          //打开一个文档
          doc.Open();
          //向文档中添加内容
          Image img = Image.GetInstance(picPath);
          //img.SetAbsolutePosition();
          doc.Add(img);
          return true;
        }
        catch (Exception ex)
        {
          return false;
          throw ex;
        }
        finally
        {
          if (doc != null)
          {
            doc.Close();
          }
        }

      }
      /// <summary>
      /// 加图片水印
      /// </summary>
      /// <param name="inputfilepath"></param>
      /// <param name="outputfilepath"></param>
      /// <param name="ModelPicName"></param>
      /// <param name="top"></param>
      /// <param name="left"></param>
      /// <returns></returns>
      public static bool PDFWatermark(string inputfilepath, string outputfilepath, string ModelPicName, float top, float left,bool onlyForFirstPage=true)
      {
        //throw new NotImplementedException();
        PdfReader pdfReader = null;
        PdfStamper pdfStamper = null;
        try
        {
          pdfReader = new PdfReader(inputfilepath);
          int numberOfPages = pdfReader.NumberOfPages;
          iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
          float width = psize.Width;
          float height = psize.Height;
          pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
          PdfContentByte waterMarkContent;
          iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName);
          image.ScaleToFit(20f, 20f);
          //此处GrayFill有问题,无法修改透明度
          //image.GrayFill = 70F;//透明度,灰色填充
          //image.Rotation = 45;//旋转
          //水印的位置 
          if (left > width - 20)
          {
            left = width - 20;
          }
          else if (left < 0)
          {
            left = width / 2 - 20 + left;
          }
          if (top > height - 20)
          {
            top = height - 20;
          }
          else if (top < 0)
          {
            top = height / 2 - 20 + top;
          }
          image.SetAbsolutePosition(left, top);
          //每一页加水印,也可以设置某一页加水印 
          if (onlyForFirstPage)
          {
            numberOfPages = 1;
          }
          for (int i = 1; i <= numberOfPages; i++)
          {
            waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
            //waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
            waterMarkContent.AddImage(image);
          }
          return true;
        }
        catch (Exception ex)
        {
          throw ex;
        }
        finally
        {
          if (pdfStamper != null)
            pdfStamper.Close();

          if (pdfReader != null)
            pdfReader.Close();
        }
      }
      /// <summary>
      /// 添加普通偏转角度文字水印
      /// </summary>
      /// <param name="inputfilepath"></param>
      /// <param name="outputfilepath"></param>
      /// <param name="waterMarkName"></param>
      /// <param name="permission"></param>
      public static void setWatermark(string inputfilepath, string outputfilepath, string waterMarkName,bool onlyForFirstPage=true)
      {
        PdfReader pdfReader = null;
        PdfStamper pdfStamper = null;
        try
        {
          pdfReader = new PdfReader(inputfilepath);
          pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
          int total = pdfReader.NumberOfPages + 1;
          iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
          float width = psize.Width;
          float height = psize.Height;
          PdfContentByte content;
          BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
          PdfGState gs = new PdfGState();
          for (int i = 1; i < total; i++)
          {
            content = pdfStamper.GetOverContent(i);//在内容上方加水印
            //content = pdfStamper.GetUnderContent(i);//在内容下方加水印
            //透明度
            gs.FillOpacity = 0.3f;
            content.SetGState(gs);
            //content.SetGrayFill(0.3f);
            //开始写入文本
            content.BeginText();
            content.SetColorFill(BaseColor.LIGHT_GRAY);
            content.SetFontAndSize(font, 100);
            content.SetTextMatrix(0, 0);
            content.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, width / 2 - 50, height / 2 - 50, 55);
            //content.SetColorFill(BaseColor.BLACK);
            //content.SetFontAndSize(font, 8);
            //content.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, 0, 0, 0);
            content.EndText();
          }
        }
        catch (Exception ex)
        {
          throw ex;
        }
        finally
        {
          if (pdfStamper != null)
            pdfStamper.Close();
          if (pdfReader != null)
            pdfReader.Close();
        }
      }
      /// <summary>
      /// 添加倾斜水印
      /// </summary>
      /// <param name="inputfilepath"></param>
      /// <param name="outputfilepath"></param>
      /// <param name="waterMarkName"></param>
      /// <param name="userPassWord"></param>
      /// <param name="ownerPassWord"></param>
      /// <param name="permission"></param>
      public static void setWatermark(string inputfilepath, string outputfilepath, string waterMarkName, string userPassWord, string ownerPassWord, int permission)
      {
        PdfReader pdfReader = null;
        PdfStamper pdfStamper = null;
        try
        {
          pdfReader = new PdfReader(inputfilepath);
          pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
          // 设置密码   
          //pdfStamper.SetEncryption(false,userPassWord, ownerPassWord, permission); 

          int total = pdfReader.NumberOfPages + 1;
          PdfContentByte content;
          BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
          PdfGState gs = new PdfGState();
          gs.FillOpacity = 0.2f;//透明度

          int j = waterMarkName.Length;
          char c;
          int rise = 0;
          for (int i = 1; i < total; i++)
          {
            rise = 500;
            content = pdfStamper.GetOverContent(i);//在内容上方加水印
            //content = pdfStamper.GetUnderContent(i);//在内容下方加水印

            content.BeginText();
            content.SetColorFill(BaseColor.DARK_GRAY);
            content.SetFontAndSize(font, 50);
            // 设置水印文字字体倾斜 开始 
            if (j >= 15)
            {
              content.SetTextMatrix(200, 120);
              for (int k = 0; k < j; k++)
              {
                content.SetTextRise(rise);
                c = waterMarkName[k];
                content.ShowText(c + "");
                rise -= 20;
              }
            }
            else
            {
              content.SetTextMatrix(180, 100);
              for (int k = 0; k < j; k++)
              {
                content.SetTextRise(rise);
                c = waterMarkName[k];
                content.ShowText(c + "");
                rise -= 18;
              }
            }
            // 字体设置结束 
            content.EndText();
            // 画一个圆 
            //content.Ellipse(250, 450, 350, 550);
            //content.SetLineWidth(1f);
            //content.Stroke(); 
          }

        }
        catch (Exception ex)
        {
          throw ex;
        }
        finally
        {
          if (pdfStamper != null)
            pdfStamper.Close();
          if (pdfReader != null)
            pdfReader.Close();
        }
      }
  }
}