一、首先要通过Adobe制作好PDF模板,目前发现只能通过这个工具才能制作PDF模板
- Adobe自己去官网下载,不过官网是要订阅的。或者自己去找破解版也行;
- 下载后废话不多说直接上图,这里创建表单可以选择已有的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