在日常开发中,处理 PDF 文件是一个常见的需求,如填充 PDF 表单、生成报告或设置文件权限等。iText7 是一个功能强大的 PDF 操作库,支持多种 PDF 操作,包括表单填充、加密、数字签名等。
本文将介绍如何使用 iText7 在 C# 中填充 PDF 表单,并将其设置为只读,同时解决可能遇到的常见问题。
在项目中添加 iText7 的 NuGet 包:
dotnet add package itext7 --version 9.1.0
dotnet add package itext7.font-asian --version 9.1.0
dotnet add package itext7.bouncy-castle-adapter --version 9.1.0
using iText.Forms;
using iText.Kernel.Pdf;
// 输入PDF文件
string src = "demo.pdf";
// 输出PDF文件
string dest = "output3.pdf";
var ms = new MemoryStream();
// 打开现有的PDF文件
using (PdfDocument document = new PdfDocument(new PdfReader(src), new PdfWriter(ms)))
{
//获取表单
var form = PdfAcroForm.GetAcroForm(document, true);
//获取表单域
var fields = form.GetAllFormFields();
//设置字体
//PdfFont systemfont = PdfFontFactory.CreateFont("simhei.ttf", PdfEncodings.IDENTITY_H);
//form.GetField("gongcheng").SetValue("xxx").SetReadOnly(true).SetFont(systemfont);
//遍历表单域进行填充
foreach (var field in fields)
{
//填充表单、设置字体、设置只读
field.Value
.SetValue("123123")
.SetReadOnly(true);
}
// 设置表单为只读
form.FlattenFields();
}
var bt = ms.ToArray();
using (FileStream fs = new FileStream(dest, FileMode.OpenOrCreate, FileAccess.Write))
{
fs.Write(bt, 0, bt.Length);
}
Console.WriteLine("Net分享 , PDF表单已填充并设置为只读");
通过PdfReader
和PdfWriter
打开现有的 PDF 文件,并创建一个新的 PDF 文件:
using (PdfDocument document = new PdfDocument(new PdfReader(src), new PdfWriter(ms)))
使用PdfAcroForm.GetAcroForm
获取 PDF 表单,并通过GetAllFormFields
获取所有字段:
var form = PdfAcroForm.GetAcroForm(document, true);
var fields = form.GetAllFormFields();
遍历表单字段,使用SetValue
方法填充数据,并通过SetReadOnly
方法将字段设置为只读:
foreach (var field in fields)
{
field.Value
.SetValue("123123") // 填充的值
.SetReadOnly(true); // 设置为只读
}
通过FlattenFields
方法将表单字段设置为不可编辑:
form.FlattenFields();
将内存流中的数据写入目标文件:
var bt = ms.ToArray();
using (FileStream fs = new FileStream(dest, FileMode.OpenOrCreate, FileAccess.Write))
{
fs.Write(bt, 0, bt.Length);
}
PdfAcroForm.GetAcroForm()
时出现空引用异常问题描述:调用PdfAcroForm.GetAcroForm()
方法时可能会抛出空引用异常。
解决方案:
问题描述:如果表单中包含中文字符,可能会出现字体不支持的问题。
解决方案:
1. 安装 iText7 的字体支持包:
dotnet add package itext7.font-asian
2. 在代码中指定支持中文的字体:
var font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
field.SetFont(font);
通过本文的介绍,可以使用 iText7 在 C# 中轻松实现 PDF 表单的填充和只读设置。iText7 提供了强大的 PDF 操作功能,适用于各种复杂的 PDF 处理场景。