跳至页脚内容
使用IRONPDF

如何在C#中使用.NET SDK创建、填充和提取PDF表单

交互式 PDF 表单将静态文档转换为数据收集工具,您可以完全通过代码生成和处理数据。 无论是构建患者入院门户、自动化贷款申请,还是从数据库生成数千个预填的合规表格, IronPDF为.NET开发人员提供了一个统一的 API,用于执行每个表单任务——创建、字段填充、数据提取和批量处理。

本指南将通过可直接放入.NET 10 项目中的 C# 代码示例,逐步完成每一项任务。

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 1 - IronPDF

如何开始使用 IronPDF?

IronPDF可在NuGet上获取,只需大约一分钟即可添加到任何.NET项目中。 在 Visual Studio 中打开软件包管理器控制台并运行:

Install-Package IronPdf
Install-Package IronPdf
SHELL

您也可以在NuGet程序包管理器 GUI 中搜索IronPDF ,或者使用.NET CLI 添加它 dotnet add package IronPdf。 无需额外的运行时依赖项或配置文件 - 该库自带在 Windows、Linux、macOS、Docker 和 Kubernetes 上渲染 PDF 所需的一切。

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 3 - 安装

该软件包面向.NET Framework 4.6.2+ 和所有现代.NET版本,包括.NET 8、 .NET 9 和.NET 10。安装软件包后,在文件顶部添加 using IronPdf;,即可生成您的第一个 PDF 表单。

跨平台部署的灵活性在生产环境中至关重要。 无论您的应用程序面向 Windows Server、Linux 容器还是 Azure 函数应用, IronPDF都能稳定运行——相同的代码在每个环境中都会产生相同的输出。

PDF表单为何有效? 了解 AcroForms

在编写代码之前,了解你要构建的是什么很有帮助。 AcroForm 规范(自 1998 年以来一直是 PDF 标准的一部分)定义了任何标准 PDF 查看器都可以显示和填写的交互式表单字段。 AcroForms 支持文本字段、复选框、单选按钮、下拉列表、列表框和签名字段。

AcroForms 是IronPDF创建和读取的格式。 与 XFA 表单(一种较旧的 Adob​​e 专有格式)不同,AcroForms 可以在 Adob​​e Reader、基于浏览器的 PDF 查看器和移动应用程序之间使用,而不会出现兼容性问题。 使用IronPDF创建 PDF 表单时,输出结果是一个符合标准的 AcroForm PDF,任何查看器都可以打开它。

表单中的每个字段都包含名称、类型和值。 名称是您以编程方式读取或写入数据时使用的键。 文档中的字段名称必须是唯一的——如果您按名称填充表单,但字段名称不完全匹配,则写入操作不会产生任何效果,这是从数据库架构填充表单时常见的错误来源。

字段类型决定了可接受的值。 文本字段可以接受任何字符串。 复选框只能选择"是"或"否"。 单选按钮接受所选选项的字符串值。 下拉菜单接受所选项目的字符串值,该值必须是创建该字段时定义的选项之一。

如何从 HTML 创建 PDF 表单?

构建可填写 PDF 表单最快的方法是将其编写为标准 HTML 格式并进行转换。 每个 HTML 表单元素都直接映射到其对应的 AcroForm 元素:<input type="text"> 变成文本字段,<input type="checkbox"> 变成复选框,<select> 变成下拉列表,<textarea> 变成多行文本字段。

通过在渲染器的 @@--CODE-490--CODE-489 ... 如果没有该标志,HTML 表单元素将呈现为静态视觉内容——您可以在 PDF 中看到它们,但它们不是交互式字段。

using IronPdf;

// HTML with form elements for PDF generation
string formHtml = @"
<html>
<body>
    <h2>Customer Registration</h2>
    <form>
        <label>Full Name:</label><br/>
        <input type='text' name='fullName'><br/>
        <label>Email Address:</label><br/>
        <input type='email' name='email'><br/>
        <label>Account Type:</label><br/>
        <select name='accountType'>
            <option value='personal'>Personal</option>
            <option value='business'>Business</option>
        </select><br/>
        <label>Newsletter:</label><br/>
        <input type='checkbox' name='newsletter' value='yes'>Subscribe<br/>
        <label>Comments:</label><br/>
        <textarea name='comments' rows='4' style='width:300px'></textarea>
    </form>
</body>
</html>";

// Enable form field generation from HTML
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

// Render and save the PDF with interactive fields
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
pdf.SaveAs("registration-form.pdf");
using IronPdf;

// HTML with form elements for PDF generation
string formHtml = @"
<html>
<body>
    <h2>Customer Registration</h2>
    <form>
        <label>Full Name:</label><br/>
        <input type='text' name='fullName'><br/>
        <label>Email Address:</label><br/>
        <input type='email' name='email'><br/>
        <label>Account Type:</label><br/>
        <select name='accountType'>
            <option value='personal'>Personal</option>
            <option value='business'>Business</option>
        </select><br/>
        <label>Newsletter:</label><br/>
        <input type='checkbox' name='newsletter' value='yes'>Subscribe<br/>
        <label>Comments:</label><br/>
        <textarea name='comments' rows='4' style='width:300px'></textarea>
    </form>
</body>
</html>";

// Enable form field generation from HTML
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

// Render and save the PDF with interactive fields
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
pdf.SaveAs("registration-form.pdf");
$vbLabelText   $csharpLabel

每个 HTML 输入框的 name 属性都会成为 PDF 中的字段名称。 这个名称是你在之后以编程方式读取或写入字段值时会用到的。 选择与数据模型相匹配的名称——如果要从数据库对象填充此表单,请根据对象的属性命名字段。

输出

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 4 - PDF 输出

文本输入框和文本区域会显示为可编辑的文本字段。 具有匹配 name 属性的单选按钮会组合在一起,因此只能选择一个。 复选框会显示为可切换字段。 生成的 PDF 文件可以在任何标准查看器中打开,所有表单字段都可供填写。

这种基于 HTML 的方法适用于以下情况:表单设计已经以网页的形式存在;您的团队更喜欢用标记语言维护表单;或者您需要生成与应用程序现有 HTML 模板完全匹配的表单。 渲染器处理所有 PDF 规范细节。

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 5 - 功能

如何通过编程方式向 PDF 添加表单字段?

当需要精确的坐标控制,或者向现有 PDF 文档添加表单字段时,程序化表单字段 API可让您直接控制每个字段的位置、大小和默认值。

创建具有明确页面坐标的字段对象。 原点位于页面左下角,x 轴向右递增,y 轴向上递增——这是 PDF 规范中使用的同一坐标系。

using IronPdf;
using IronSoftware.Forms;

// Generate a base PDF document to add fields to
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(
    "<h1>Application Form</h1><p>Please complete all fields below.</p>");

// Text field: name, default value, page index, x, y, width, height
var nameField = new TextFormField("applicantName", "", 0, 50, 700, 200, 20);
pdf.Form.Add(nameField);

// Checkbox field with default unchecked state
var termsCheckbox = new CheckboxFormField("agreeTerms", "no", 0, 50, 650, 15, 15);
pdf.Form.Add(termsCheckbox);

// Dropdown with a defined list of options
var departmentCombo = new ComboboxFormField(
    "department", "", 0, 50, 600, 150, 20,
    new List<string> { "Engineering", "Marketing", "Sales", "Support" });
pdf.Form.Add(departmentCombo);

// Save the output document
pdf.SaveAs("application-with-fields.pdf");
using IronPdf;
using IronSoftware.Forms;

// Generate a base PDF document to add fields to
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(
    "<h1>Application Form</h1><p>Please complete all fields below.</p>");

// Text field: name, default value, page index, x, y, width, height
var nameField = new TextFormField("applicantName", "", 0, 50, 700, 200, 20);
pdf.Form.Add(nameField);

// Checkbox field with default unchecked state
var termsCheckbox = new CheckboxFormField("agreeTerms", "no", 0, 50, 650, 15, 15);
pdf.Form.Add(termsCheckbox);

// Dropdown with a defined list of options
var departmentCombo = new ComboboxFormField(
    "department", "", 0, 50, 600, 150, 20,
    new List<string> { "Engineering", "Marketing", "Sales", "Support" });
pdf.Form.Add(departmentCombo);

// Save the output document
pdf.SaveAs("application-with-fields.pdf");
$vbLabelText   $csharpLabel

TextFormField 创建一个单行文本输入框。 CheckboxFormField 放置一个可切换的复选框。 ComboboxFormField 创建一个仅限于所提供选项列表的下拉列表。每个类都公开了用于设置 Tab 键顺序、工具提示文本、只读状态和必填字段标志的附加属性。

HTML 转换和程序化字段创建这两种方法可以结合起来使用。 从 HTML 生成基本布局以实现高效的模板控制,然后使用 API 添加具有精确定位的专用字段。 表单填写和编辑指南涵盖了所有可用的字段类型。

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 6 - PDF Forms .NET SDK - IronPDF

如何填写现有的PDF表单?

许多工作流程都始于一个预先存在的 PDF 表单——政府模板、供应商合同或您的组织从合作伙伴处收到的标准化申请表。 通过程序自动填写这些表单,无需重新创建原始设计即可自动生成文档。

使用 PdfDocument.FromFile 加载现有 PDF,使用 FindFormField 按名称定位每个字段,并为字段的 Value 属性赋值。

using IronPdf;

// Load the existing PDF containing AcroForm fields
PdfDocument pdf = PdfDocument.FromFile("existing-application.pdf");

// Fill text fields by exact field name
var nameField = pdf.Form.FindFormField("applicantName");
nameField.Value = "Sarah Johnson";

var emailField = pdf.Form.FindFormField("email");
emailField.Value = "sarah.johnson@example.com";

// Set checkbox and radio button values
var termsField = pdf.Form.FindFormField("agreeTerms");
termsField.Value = "Yes";

var accountTypeField = pdf.Form.FindFormField("accountType");
accountTypeField.Value = "business";

// Set dropdown selection to one of its defined options
var departmentField = pdf.Form.FindFormField("department");
departmentField.Value = "Engineering";

// Save the completed form
pdf.SaveAs("completed-application.pdf");
using IronPdf;

// Load the existing PDF containing AcroForm fields
PdfDocument pdf = PdfDocument.FromFile("existing-application.pdf");

// Fill text fields by exact field name
var nameField = pdf.Form.FindFormField("applicantName");
nameField.Value = "Sarah Johnson";

var emailField = pdf.Form.FindFormField("email");
emailField.Value = "sarah.johnson@example.com";

// Set checkbox and radio button values
var termsField = pdf.Form.FindFormField("agreeTerms");
termsField.Value = "Yes";

var accountTypeField = pdf.Form.FindFormField("accountType");
accountTypeField.Value = "business";

// Set dropdown selection to one of its defined options
var departmentField = pdf.Form.FindFormField("department");
departmentField.Value = "Engineering";

// Save the completed form
pdf.SaveAs("completed-application.pdf");
$vbLabelText   $csharpLabel

FindFormField 根据表单创建期间分配的名称定位字段。 字段名称匹配区分大小写且必须完全一致——"applicantName"和"ApplicantName"是不同的字段。 如果您正在填写第三方表单,并且不确定字段名称,请遍历 pdf.Form 以打印每个字段的名称,然后再尝试按名称填写。

输入

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 7 - PDF 输入示例

输出

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 8 - 已填写的 PDF 输出

不同的字段类型需要相应的数值格式。 文本字段接受任何字符串。 复选框只能选择"是"或"否"。 单选按钮接受所需选项的字符串值。 下拉菜单接受已定义选项之一的字符串值——设置不在选项列表中的值无效。

处理包含多个字段的表单时,直接遍历 pdf.Form,而不是重复调用 FindFormField。 对于批量操作来说,迭代效率更高,并且避免了对字段集合进行重复的线性搜索。

如何读取和提取表单字段数据?

从提交的 PDF 中提取表单数据是相反的操作:加载已完成的表单,然后读取每个字段的名称和当前值以进行后续处理。 这种模式支持自动化数据录入工作流程,用户填写 PDF 表格并上传,应用程序即可处理数据,无需手动输入数据。

using IronPdf;

// Load the completed, submitted PDF form
PdfDocument pdf = PdfDocument.FromFile("submitted-form.pdf");

// Iterate all fields to extract names, values, and types
Console.WriteLine("Form Data Extraction:");
Console.WriteLine("----------------------");
foreach (var field in pdf.Form)
{
    Console.WriteLine($"Field: {field.Name}");
    Console.WriteLine($"Value: {field.Value}");
    Console.WriteLine($"Type:  {field.GetType().Name}");
    Console.WriteLine();
}

// Or retrieve specific fields for targeted processing
var customerName  = pdf.Form.FindFormField("applicantName")?.Value ?? "Not provided";
var customerEmail = pdf.Form.FindFormField("email")?.Value ?? "Not provided";
Console.WriteLine($"Customer: {customerName} ({customerEmail})");
using IronPdf;

// Load the completed, submitted PDF form
PdfDocument pdf = PdfDocument.FromFile("submitted-form.pdf");

// Iterate all fields to extract names, values, and types
Console.WriteLine("Form Data Extraction:");
Console.WriteLine("----------------------");
foreach (var field in pdf.Form)
{
    Console.WriteLine($"Field: {field.Name}");
    Console.WriteLine($"Value: {field.Value}");
    Console.WriteLine($"Type:  {field.GetType().Name}");
    Console.WriteLine();
}

// Or retrieve specific fields for targeted processing
var customerName  = pdf.Form.FindFormField("applicantName")?.Value ?? "Not provided";
var customerEmail = pdf.Form.FindFormField("email")?.Value ?? "Not provided";
Console.WriteLine($"Customer: {customerName} ({customerEmail})");
$vbLabelText   $csharpLabel

Form 属性公开文档中所有字段的可枚举集合。 每个字段对象提供其 Name、当前 Value 和类型信息。 通用表单处理器使用此模式来处理任何 PDF 表单结构,而无需硬编码字段名称。

输出

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 9 - 控制台输出

空条件运算符 ?. on FindFormField 处理预期字段缺失的情况 - 在处理来自多个来源的表单时非常有用,这些表单可能具有略微不同的字段结构。 始终提供备用值或进行空值检查,而不是假设字段存在。

提取的数据可直接与 Entity Framework 或.NET集成以进行数据库写入,进行 JSON 序列化以进行 API 响应,并生成 CSV 文件以进行报告。 当您还需要从扫描或基于图像的表单提交中提取数据,而这些字段没有以数字方式填写时,可以将IronPDF与IronOCR结合使用。

如何大规模生成个性化表单?

PDF表单自动化的最大应用场景是批量生成——生成成百上千份预先填充了来自数据库、API或CSV文件数据的表单。一个简单的循环就能完成这项工作,无需任何额外的基础设施。

using IronPdf;

// Retrieve customer records from your data source
var customers = GetCustomersFromDatabase();

ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

foreach (var customer in customers)
{
    // Build an HTML template with static data pre-filled and interactive fields for user input
    string formHtml = $@"
    <html><body>
        <h2>Annual Review Form</h2>
        <p>Customer: {customer.Name}</p>
        <p>Account:  {customer.AccountNumber}</p>
        <label>Satisfaction Rating (1-5):</label><br/>
        <input type='text' name='rating' maxlength='1'><br/>
        <label>Feedback:</label><br/>
        <textarea name='feedback' rows='5' style='width:100%'></textarea>
    </body></html>";

    PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
    pdf.SaveAs($"review-form-{customer.AccountNumber}.pdf");
}
using IronPdf;

// Retrieve customer records from your data source
var customers = GetCustomersFromDatabase();

ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

foreach (var customer in customers)
{
    // Build an HTML template with static data pre-filled and interactive fields for user input
    string formHtml = $@"
    <html><body>
        <h2>Annual Review Form</h2>
        <p>Customer: {customer.Name}</p>
        <p>Account:  {customer.AccountNumber}</p>
        <label>Satisfaction Rating (1-5):</label><br/>
        <input type='text' name='rating' maxlength='1'><br/>
        <label>Feedback:</label><br/>
        <textarea name='feedback' rows='5' style='width:100%'></textarea>
    </body></html>";

    PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
    pdf.SaveAs($"review-form-{customer.AccountNumber}.pdf");
}
$vbLabelText   $csharpLabel

HTML 模板直接嵌入静态客户数据,因此收件人可以看到预先打印的姓名和账号,并提供交互式字段供他们提供所需数据。 批量处理数百条记录只需几秒钟即可完成,而手动准备则需要数小时。

循环结构适用于任何数据源: Entity Framework 查询、API 响应或 CSV 导入。 每次迭代都会生成一个完整的、可直接分发的 PDF 文件,该文件是针对该记录定制的。 对于高吞吐量场景,使用 awaitTask.WhenAll 并行渲染表单 - IronPDF 的 RenderHtmlAsPdfAsync 方法支持完全异步渲染。

批量生成后,表单通常会被打包成 ZIP 存档,以便使用IronZIP进行分发、通过电子邮件集成发送、上传到云存储或路由到电子签名平台以完成装订。

如何在填写完成后展平或锁定 PDF 表单?

表单完全填写并验证后,通常需要将其锁定,以防止再编辑其中的值。 扁平化操作会将所有交互式表单字段转换为静态的、不可编辑的视觉内容,同时保留已完成表单的确切外观。

using IronPdf;

// Load a completed, signed form
PdfDocument pdf = PdfDocument.FromFile("completed-application.pdf");

// Flatten all form fields - converts interactive fields to static content
pdf.Form.Flatten();

// Save the locked, non-editable version
pdf.SaveAs("locked-application.pdf");
using IronPdf;

// Load a completed, signed form
PdfDocument pdf = PdfDocument.FromFile("completed-application.pdf");

// Flatten all form fields - converts interactive fields to static content
pdf.Form.Flatten();

// Save the locked, non-editable version
pdf.SaveAs("locked-application.pdf");
$vbLabelText   $csharpLabel

对于归档已完成的表格、生成符合 PDF/A 标准的文档以进行长期存储以及生成最终副本进行分发而言,展平是正确的方法。 扁平化后,表单数据仍然可见,但无法修改。 PDF 拼合指南涵盖了其他拼合选项,包括选择性场拼合。

对于需要具有法律约束力的完成情况, IronPDF还支持数字签名,它以加密方式将签名者的身份与文档绑定。 数字签名和表单扁平化服务于不同的目的——签名证明真实性,扁平化防止修改。

下一步计划是什么?

.NET中的 PDF 表单涵盖四个核心操作:从 HTML 或通过 API 创建表单、从数据源填充现有表单、提取提交的数据以及批量生成个性化副本。 IronPDF通过一致的 API 处理所有这四种情况,相同的代码可以在 Windows、Linux、macOS 和容器内运行。

创建 PDF 表单的操作指南涵盖了所有可用的字段类型,并附有代码示例。 《填写和编辑表单指南》深入介绍了批量字段更新、单选按钮组和列表框处理。 IronPDF文档中心提供了完整的 API 参考和高级主题,包括多页表单、表单字段验证以及高容量管道的性能调优。

开始免费试用,探索 PDF 表单功能在您自己的项目中的应用,或查看生产部署的许可选项

PDF Forms .NET SDK:使用IronPDF在 C# 中创建可填写 PDF:图 10 - 许可

常见问题解答

IronPDF使用哪种PDF表单标准?

IronPDF创建和读取AcroForms——自1998年PDF规范中定义的交互表单标准。AcroForms受到Adobe Reader、基于浏览器的PDF查看器和移动应用的支持,而较旧的XFA格式兼容性有限。

如何在IronPDF中启用从HTML创建表单字段?

在调用`RenderHtmlAsPdf`之前,设置`renderer.RenderingOptions.CreatePdfFormsFromHtml = true`。没有此标志,HTML表单元素将呈现为静态视觉内容而不是交互式AcroForm字段。

如何在现有PDF表单中填写特定字段?

使用`PdfDocument.FromFile`加载PDF,调用`pdf.Form.FindFormField("fieldName")`检索字段对象,然后为其`Value`属性分配字符串。字段名称匹配区分大小写。使用`pdf.SaveAs`保存结果。

如何从提交的PDF中提取所有表单字段值?

使用`foreach (var field in pdf.Form)`遍历`pdf.Form`并读取每个字段的`Name`和`Value`属性。针对特定的提取,使用`pdf.Form.FindFormField("name")?.Value`与null条件运算符一起使用来安全地处理缺失字段。

IronPDF可以在循环中从数据库生成数百个表单吗?

可以。创建一个`ChromePdfRenderer`,设置`CreatePdfFormsFromHtml = true`,遍历数据记录,为每个记录构建HTML字符串,调用`RenderHtmlAsPdf`并保存每个结果。对于高吞吐量,使用`RenderHtmlAsPdfAsync`与`Task.WhenAll`并行渲染。

使PDF表单扁平化的功能是什么?

扁平化将所有交互式表单字段转换为静态的、不可编辑的视觉内容,同时保留填写表单的外观。调用`pdf.Form.Flatten()`然后保存。结果适合存档、PDF/A的合规性和禁止字段编辑的分发。

IronPDF能在Linux和Docker容器中运行吗?

能。IronPDF可在Windows、Linux、macOS、Docker和Kubernetes上运行。同一段C#代码在所有平台上生成相同的PDF输出。查看文档中的IronPDF Linux和Docker指南以了解平台特定的配置。

IronPDF支持哪些平台和.NET版本用于PDF表单?

IronPDF支持.NET Framework 4.6.2及以上版本,以及所有现代.NET版本,包括.NET 6、.NET 7、.NET 8、.NET 9和.NET 10。它还支持ASP.NET、ASP.NET Core、Blazor Server、Azure Functions和MAUI应用程序。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me