首页 > 其他分享 >.net6 使用iTextSharp操作PDF模板

.net6 使用iTextSharp操作PDF模板

时间:2023-03-17 15:15:01浏览次数:316  
标签:set get float content iTextSharp net6 PDF public

      一、首先要通过Adobe制作好PDF模板,目前发现只能通过这个工具才能制作PDF模板

  1. Adobe自己去官网下载,不过官网是要订阅的。或者自己去找破解版也行;
  2. 下载后废话不多说直接上图,这里创建表单可以选择已有的PDF或者自己新增文件也行; 

    

   3. 创建好表单后,这里可以选择自己想要操作的域

    

 

 

      4.域里面可以设置好的Filed,Filed的字体大小可以通过右键属性设置;

   

 

   二、按照上面所说的基本字可以创建好自己的PDF模板,接下来我们来操作PDF模板

    1、使用NuGet包导入 iTextSharp.LGPLv2.Core.Fix,或者自己用CLI导入也行(这里的命令自己写);

    2、好了废话不多说,直接上代码

  1     public class PdfUitil
  2     {
  3 
  4         /// <summary>
  5         /// 重写PDF模板
  6         /// </summary>
  7         /// <param name="fontPath">字体路径</param>
  8         /// <param name="tempPdfFilePath">模板路径</param>
  9         /// <param name="para">模板参数</param>
 10         /// <param name="imgFileDomain">图片</param>
 11         /// <param name="waterMark">水印</param>
 12         /// <returns></returns>
 13         public static byte[] OverWritePdfTemp(string fontPath, string tempPdfFilePath, Dictionary<string, string> para, List<PDFImgFileDomain> imgFileDomain, PDFWaterMark waterMark)
 14         {
 15             //获取中文字体,第三个参数表示为是否潜入字体,但只要是编码字体就都会嵌入。
 16             BaseFont baseFont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
 17             //读取模板文件
 18             PdfReader reader = new PdfReader(tempPdfFilePath);
 19             //创建文件流用来保存填充模板后的文件
 20             MemoryStream stream = new MemoryStream();
 21             PdfStamper stamp = new PdfStamper(reader, stream);
 22             //设置表单字体,在高版本有用,高版本加入这句话就不会插入字体,低版本无用
 23             stamp.AcroFields.AddSubstitutionFont(baseFont);
 24             //文件表单域Filds
 25             AcroFields form = stamp.AcroFields;
 26             //表单文本框是否锁定
 27             stamp.FormFlattening = true;
 28             //填充表单,para为表单的一个(属性-值)字典
 29             foreach (KeyValuePair<string, string> parameter in para)
 30             {
 31                 //要输入中文就要设置域的字体;
 32                 form.SetFieldProperty(parameter.Key, "textfont", baseFont, null);
 33                 //为需要赋值的域设置值;
 34                 form.SetField(parameter.Key, parameter.Value);
 35             }
 36             #region 添加图片 
 37             imgFileDomain.ForEach(item =>
 38             {
 39                 //通过域名获取所在页和坐标,左下角为起点
 40                 float[] positions = form.GetFieldPositions(item.ImgFiled);
 41                 int pageNo = (int)positions[0];
 42                 float x = positions[1];
 43                 float y = positions[2];
 44 
 45                 //读图片
 46                 //string imgpath = $@"{AppContext.BaseDirectory}qm.png";
 47                 Image image = Image.GetInstance(item.ImgPath);
 48                 //获取操作的页面
 49                 PdfContentByte under = stamp.GetOverContent(pageNo);
 50                 //调整图片角度
 51                 image.RotationDegrees = item.ImgPoint; //270;
 52                 //根据域的大小缩放图片
 53                 image.ScaleToFit(item.Width, item.Height);
 54                 //image.ScaleToFit(100, 16);
 55                 //添加图片
 56                 image.SetAbsolutePosition(x, y);
 57                 under.AddImage(image);
 58             });
 59             #endregion
 60 
 61             #region 添加水印
 62             if (waterMark != null)
 63             {
 64                 //获取pdf页数
 65                 int total = reader.NumberOfPages + 1;
 66                 //获取页面大小
 67                 Rectangle psize = reader.GetPageSize(1);
 68                 float width = psize.Width;
 69                 float height = psize.Height;
 70                 PdfContentByte content;
 71                 PdfGState gs = new PdfGState();
 72                 for (int i = 1; i < total; i++)
 73                 {
 74                     switch (waterMark.Direction)
 75                     {
 76                         case WaterDirectionEnum.Over:
 77                             content = stamp.GetOverContent(i);//在内容上方加水印
 78                             break;
 79                         case WaterDirectionEnum.Under:
 80                             content = stamp.GetUnderContent(i);//在内容下方加水印
 81                             break;
 82                         default:
 83                             content = stamp.GetOverContent(i);//在内容上方加水印
 84                             break;
 85                     }
 86                     //透明度
 87                     //gs.FillOpacity = 0.3f;
 88                     gs.FillOpacity = waterMark.FillOpacity;
 89                     content.SetGState(gs);
 90                     //开始写入文本
 91                     content.BeginText();
 92                     ///content.SetColorFill(BaseColor.Gray);
 93                     content.SetColorFill(waterMark.Color);
 94                     content.SetFontAndSize(baseFont, waterMark.FontSize);
 95                     //content.SetFontAndSize(baseFont, 30);
 96                     content.SetTextMatrix(0, 0);
 97                     content.ShowTextAligned(Element.ALIGN_CENTER, waterMark.Text, width - 120, height - 120, -45);
 98                     content.EndText();
 99                 }
100             }
101             #endregion
102 
103             //按顺序关闭io流
104             stamp.Close();
105             reader.Close();
106             //获取流字节
107             var fileBytes = stream.ToArray();
108 
109             #region 这是测试用的,用于把重写后的PDF文件保存到本地。
110             //MemoryStream m = new MemoryStream(fileBytes);
111             //string file = string.Format(@"2.pdf");//可根据文件类型自定义后缀
112             //FileStream fs = new FileStream(file, FileMode.OpenOrCreate);
113             //m.WriteTo(fs);
114             //m.Close();
115             //fs.Close();
116             #endregion
117             return fileBytes;
118         }
119     }
120 
121     /// <summary>
122     /// PDF文件图片域相关参数
123     /// </summary>
124     public class PDFImgFileDomain
125     {
126         /// <summary>
127         /// PDF图片域属性
128         /// </summary>
129         public string ImgFiled { get; set; }
130 
131         /// <summary>
132         /// 图片绝对路径
133         /// </summary>
134         public string ImgPath { get; set; }
135 
136         /// <summary>
137         /// 图片角度
138         /// </summary>
139         public float ImgPoint { get; set; } = 0;
140 
141         /// <summary>
142         /// 图片宽度
143         /// </summary>
144         public float Width { get; set; } = 30;
145 
146         /// <summary>
147         /// 图片高度
148         /// </summary>
149         public float Height { get; set; } = 30;
150     }
151 
152     /// <summary>
153     /// PDF水印相关参数
154     /// </summary>
155     public class PDFWaterMark
156     {
157         /// <summary>
158         /// 水印文本
159         /// </summary>
160         public string Text { get; set; }
161 
162         /// <summary>
163         /// 透明度
164         /// </summary>
165         public float FillOpacity { get; set; }
166 
167         /// <summary>
168         /// 水印方向
169         /// </summary>
170         public WaterDirectionEnum Direction { get; set; }
171 
172         /// <summary>
173         /// 水印颜色
174         /// </summary>
175         public BaseColor Color { get; set; } = BaseColor.Gray;
176 
177         /// <summary>
178         /// 水印字体大小
179         /// </summary>
180         public float FontSize { get; set; } = 30;
181     }
182 
183     /// <summary>
184     /// 水印方向
185     /// </summary>
186     public enum WaterDirectionEnum
187     {
188         /// <summary>
189         /// 上方
190         /// </summary>
191         Over,
192         /// <summary>
193         /// 下方
194         /// </summary>
195         Under,
196     }
View Code

       如有不足的地方欢迎大佬在评论区指教

标签:set,get,float,content,iTextSharp,net6,PDF,public
From: https://www.cnblogs.com/Early/p/17226685.html

相关文章

  • .NET6 给单元格设置背景色并导出Excel
    ///<summary>///给单元格设置背景色///</summary>///<returns></returns>publicasyncTask<IActionResult>CollectEx......
  • Vue 引入PDF文件预览,可下载,插件vue-pdf
    最近的一个项目中用到了读取本地文件PDF,先是用了PDF组件,没有达到想要的效果,后来查找官网用iframe标签来替代PDF组件,达到想要的效果了, 1、第一步先安装vue-pdf插件......
  • 图片转为base64和 图片的base64转为pdf的base64
    publicStringGetImageStr(StringimgPath){//将图片文件转化为字节数组字符串,并对其进行Base64编码处理StringimgFile=imgPath;//待处理的图片......
  • java OSS存储文件 ofd文件格式转pdf
    javaofd文件转pdf之前有博客写了ofd与pdf文件进行相互转化,【pdf与ofd相互转化】,但是spire-pdf的jar包进行ofd转为pdf时,如果是双层ofd文件,最后转化的结果会丢失......
  • 【C#】pdf文件合并
    环境:VS2019+Win10+.NETFramework3.5依赖于:itextsharp.dll 源码,封装接口:///<summary>///合并pdf文件至输出文件///</summary>......
  • 使用 pdf.js 在网页中加载 pdf 文件
    原文链接:https://blog.csdn.net/WuLex/article/details/105177046写的很详细,操作步骤都有。1.pdfjs库简介PDF.js是由Mozilla主导推出的可以将PDF文件转换为H5页面进......
  • gRPC之.Net6中的客户端和服务端共用proto协议文件
    1、说明在上一篇文章gRPC之.Net6中的初步使用介绍中,我们简单的介绍了gRPC在服务端、客户端以及Web项目中的使用。有一个问题,不知道大家发现没有,就是不管在服务端项目还是......
  • Net6 EfCore 执行原生SQL
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、适用于: --insert update delete 1.1、内插值方式:FormattableString--该方式不存在注入攻击风险,放心用  ......
  • chatPDF原理学习
    一.很火的chatPDF.分析原因,想一下能和一本书沟通,这本身就是一件神奇的事情,再者,它能帮助你通过聊天的方式学习到其中的内容,调动了学习的乐趣.除了装X外,乐趣......
  • Itext实现导出PDF常用方法说明
    实现1.设置响应格式response.setContentType("application/pdf");response.setHeader("Expires","0");response.setHeader("Cache-Control","must-revalidate,post-che......