之前在項目中一直使用iTextSharp作為操作PDF的工具,然而開發者已經終止了iTextSharp的功能更新並提示用戶盡快將項目遷移至iText7 for .NET,升級到iText7后很多使用方式都發生了改變,雖然官方提供了詳細的文檔但沒有中文,網絡上能搜索到的資料也幾乎都是iTextSharp的或是Java的,下面我就整理一下使用在.Net中使用iText7填充PDF表單的操作。
安裝iText7、解決中文問題
使用NuGet或.NET CLI安裝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
准備PDF表單##
使用Adobe Acrobat DC或其他PDF工具制作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();
}
}