优秀的编程知识分享平台

网站首页 > 技术文章 正文

C# 实战指南:使用 iText7 高效处理 PDF 文件

nanyue 2025-04-30 18:36:28 技术文章 3 ℃

1. 引言

在开发中,处理 PDF 文件是一个常见的需求,例如生成报告、填充表单、设置权限或签名等。iText7 是一个功能强大的 PDF 操作库,支持多种 PDF 操作,包括表单填充、加密、数字签名、分割与合并等。

本文将通过实战,详细介绍如何使用 iText7 在 C# 中处理 PDF 文件,帮助快速上手并解决常见问题。


2. 环境准备

2.1 安装 iText7

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

3. 使用 iText7 处理 PDF 文件

3.1 填充 PDF 表单并设置为只读

打开一个 PDF 文件,填充表单字段,并将其设置为只读:

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 时返回
解决方案:确保字段名称与 PDF 表单中的实际名称一致,可以使用 PDF 编辑工具(如 Adobe Acrobat)检查字段名称。

4.2 中文字体显示问题

问题描述:填充的中文字符显示为乱码。
解决方案

  1. 1. 安装 iText7 的字体支持包:
    dotnet add package itext7.font-asian
  2. 2. 在代码中指定支持中文的字体:
    var font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
    field.SetFont(font);

5. 总结

通过本文的实战案例,您可以使用 iText7 在 C# 中轻松实现 PDF 表单填充、文件合并、分割和加密等操作。iText7 提供了强大的功能,适用于各种复杂的 PDF 处理场景。






最近发表
标签列表