zoukankan      html  css  js  c++  java
  • 利用iTextSharp.dll读取PDF到string、制作水印,图片转PDF

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

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

    但勉强可以用

    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:WINDOWSFontsSIMYOU.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:WINDOWSFontsSIMFANG.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();
            }
          }
      }
    }
  • 相关阅读:
    启用oracle 11g自己主动收集统计信息
    在java中,怎样跳出当前的多重循环?
    从编程的角度理解gradle脚本﹘﹘Android Studio脚本构建和编程[魅族Degao]
    【SpringMVC架构】SpringMVC入门实例,解析工作原理(二)
    实现icon和文字垂直居中的两种方法-(vertical-align and line-height)
    android发送get请求时报错
    KeyEvent 键码值
    Android-黑科技-微信抢红包必备软件
    Delicious Apples (hdu 5303 贪心+枚举)
    vim 插件配置博客记录
  • 原文地址:https://www.cnblogs.com/swtool/p/4863284.html
Copyright © 2011-2022 走看看