using System; using System.IO; using iText.Kernel.Pdf; using iText.Forms; using iText.Forms.Fields; // 输入 PDF 文件路径 using System.Reflection.PortableExecutable; string src = "template.pdf"; // 输出 PDF 文件路径 string dest = "filled_form.pdf"; // 打开现有的 PDF 文件 using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest))) { // 获取 PDF 表单 PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true); // 填充表单字段 form.GetField("Name").SetValue("Netshare").SetReadOnly(true); form.GetField("Date").SetValue("2025-04-19").SetReadOnly(true); form.GetField("Amount").SetValue("$1000").SetReadOnly(true); // 将表单字段设置为不可编辑 form.FlattenFields(); } Console.WriteLine("PDF 表单已填充并设置为只读");
3.2 合并多个 PDF 文件
using System; using iText.Kernel.Pdf; string[] pdfFiles = { "file1.pdf", "file2.pdf", "file3.pdf" }; string dest = "merged.pdf"; using (PdfDocument mergedPdf = new PdfDocument(new PdfWriter(dest))) { foreach (stringfilein pdfFiles) { using (PdfDocument pdf = new PdfDocument(new PdfReader(file))) { pdf.CopyPagesTo(1, pdf.GetNumberOfPages(), mergedPdf); } } } Console.WriteLine("PDF 文件已成功合并");
3.3 分割 PDF 文件
using System; using iText.Kernel.Pdf; string src = "large.pdf"; string outputDir = "output/"; using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(src))) { for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++) { string dest = $"{outputDir}page-{i}.pdf"; using (PdfDocument singlePagePdf = new PdfDocument(new PdfWriter(dest))) { pdfDoc.CopyPagesTo(i, i, singlePagePdf); } } } Console.WriteLine("PDF 文件已成功分割");
3.4 加密 PDF 文件
using System; using iText.Kernel.Pdf; string src = "document.pdf"; string dest = "encrypted.pdf"; WriterProperties props = new WriterProperties() .SetStandardEncryption( "user_password".GetBytes(), "owner_password".GetBytes(), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_256 ); using (PdfWriter writer = new PdfWriter(dest, props)) using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), writer)) { Console.WriteLine("PDF 文件已加密"); }
4. 常见问题及解决方案
4.1 表单字段名称不匹配
问题描述:调用 GetField 时返回 null。 解决方案:确保字段名称与 PDF 表单中的实际名称一致,可以使用 PDF 编辑工具(如 Adobe Acrobat)检查字段名称。
4.2 中文字体显示问题
问题描述:填充的中文字符显示为乱码。 解决方案:
1. 安装 iText7 的字体支持包:
dotnet add package itext7.font-asian
2. 在代码中指定支持中文的字体:
var font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA); field.SetFont(font);
5. 总结
通过本文的实战案例,您可以使用 iText7 在 C# 中轻松实现 PDF 表单填充、文件合并、分割和加密等操作。iText7 提供了强大的功能,适用于各种复杂的 PDF 处理场景。