之前在项目中一直使用iTextSharp作为操作PDF的工具,然而开发者已经终止了iTextSharp的功能更新并提示用户尽快将项目迁移至iText7 for .NET,升级到iText7后很多使用方式都发生了改变,虽然官方提供了详细的文档但没有中文,网络上能搜索到的资料也几乎都是iTextSharp的或是Java的,下面我就整理一下使用在.Net中使用iText7填充PDF表单的操作。
安装iText7、解决中文问题
NuGet:
PM>Install-Package itext7
.NET CLI
dotnet add package itext7
如果只安装安装上面的包那么是无法在生成的PDF文件中输出中文的,我们还要安装亚洲字体包来解决输出中文的问题 (也能解决输出日文和韩文的问题) 。关于PDF中字体的问题可以查看这篇文章 https://blog.csdn.net/u012397189/article/details/78471319
NuGet
PM>Install-Package itext7.font-asian
.NET CLI
dotnet add package itext7.font-asian
使用Adobe Acrobat DC或其他PDF工具制作PDF表单。
public static class PDFUtil
{
/// <summary>
/// 使用Dictionary填充PDF表单
/// </summary>
/// <param name="templatePath">PDF表单模板地址</param>
/// <param name="Dic">要填充的数据</param>
/// <returns>PDF文件字节流</returns>
public static byte[] FillForm(String templatePath,Dictionary<String,String> Dic)
{
var ms = new MemoryStream();
using (PdfDocument document = new PdfDocument(new PdfReader(templatePath), new PdfWriter(ms)))
{
//使用内置字体
PdfFont font = PdfFontFactory.CreateFont("STSong-Light", "UniGB-UCS2-H", true);
//使用系统字体
PdfFont systemfont = PdfFontFactory.CreateFont("C:/Windows/Fonts/simhei.ttf", PdfEncodings.IDENTITY_H, true);
//获取表单
var form = PdfAcroForm.GetAcroForm(document, true);
//获取表单域
var fields = form.GetFormFields();
//遍历表单域进行填充
foreach (var field in fields)
{
//在Dictionary中查找有无对应域的数据
if (Dic.TryGetValue(field.Key, out string value))
{
//填充表单、设置字体、设置只读
field.Value
.SetValue(value)
.SetFont(systemfont)
.SetReadOnly(true);
}
}
}
return ms.ToArray();
}
}
class Program
{
static void Main(string[] args)
{
var dic = new Dictionary<string, string>();
dic.Add("name", "带恶人");
dic.Add("idcard", "210101199909099999");
dic.Add("sex", "男");
dic.Add("birthday", "1999-09-09");
dic.Add("location", "皮条胡同老拉家");
dic.Add("bankcard", "6214830200000000");
dic.Add("bankname", "召冏艮亍");
var filebyte=PDFUtil.FillForm(@"D:\project\PDFFromFill\demofile\表单.pdf", dic);
using (FileStream fs = new FileStream(@"D:\project\PDFFromFill\demofile\输出表单.pdf",FileMode.OpenOrCreate, FileAccess.Write))
{
fs.Write(filebyte, 0, filebyte.Length);
}
Console.ReadLine();
}
}
原文:https://www.cnblogs.com/finaldusk/p/11997880.html