C# 使用IronPDF打印表单到PDF
使用 IronPDF 在 C# 中将 Windows 窗体打印为 PDF 非常简单:使用 ChromePdfRenderer 渲染窗体的 HTML 表示形式,保存到磁盘或内存,只需几行代码即可生成像素级完美的 PDF。
将 Windows Forms 应用程序导出为 PDF 是业务线软件的常见需求。 无论您是需要存档数据输入屏幕、根据表单状态生成面向客户的报告,还是在不接触打印机的情况下捕获打印预览,将 C# 表单转换为 PDF 都能消除日常工作流程中的摩擦。 IronPDF提供了一个 .NET 原生 API,可以处理从 HTML 渲染到最终 PDF 输出的转换管道,让您可以跳过脆弱的 GDI+ 打印 hack。
如何安装 IronPDF?
通过 NuGet 将 IronPDF 添加到您的项目中。 打开软件包管理器控制台并运行:
Install-Package IronPdf
Install-Package IronPdf
或使用 .NET CLI:
dotnet add package IronPdf
dotnet add package IronPdf
安装完成后,在任何调用 API 的文件的顶部添加 using IronPdf;。 该软件包也可直接在NuGet.org/packages/IronPdf上获取。 在ironpdf.com/licensing/上可获得免费试用许可证密钥,以便在评估期间解锁无水印输出。
如何使用 HTML 将 Windows 窗体转换为 PDF?
将 C# 表单转换为 PDF 的最可靠方法是构建表单数据的 HTML 快照,并使用 ChromePdfRenderer 渲染该快照。 这种方法将视觉渲染与 WinForms 的 GDI+ 表面解耦,从而提供清晰、可移植的输出,在每个 PDF 查看器中看起来都相同。
using IronPdf;
// Set your license key once at application startup
License.LicenseKey = "YOUR-LICENSE-KEY";
// Compose an HTML representation of your form data
string formHtml = $"""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; color: #222; }}
h1 {{ color: #1a4a8a; border-bottom: 2px solid #1a4a8a; padding-bottom: 8px; }}
label {{ font-weight: bold; display: inline-block; width: 160px; }}
.row {{ margin: 12px 0; }}
.box {{ border: 1px solid #bbb; padding: 20px; border-radius: 4px; }}
</style>
</head>
<body>
<h1>Customer Registration Form</h1>
<div class="box">
<div class="row"><label>Full Name:</label> Jane Smith</div>
<div class="row"><label>Email:</label> jane@example.com</div>
<div class="row"><label>Phone:</label> +1 555-0100</div>
<div class="row"><label>Date:</label> {DateTime.Now:yyyy-MM-dd}</div>
</div>
</body>
</html>
""";
// Render HTML to PDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 25;
renderer.RenderingOptions.MarginRight = 25;
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
pdf.SaveAs("CustomerForm.pdf");
Console.WriteLine($"PDF saved -- {pdf.PageCount} page(s).");
using IronPdf;
// Set your license key once at application startup
License.LicenseKey = "YOUR-LICENSE-KEY";
// Compose an HTML representation of your form data
string formHtml = $"""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; color: #222; }}
h1 {{ color: #1a4a8a; border-bottom: 2px solid #1a4a8a; padding-bottom: 8px; }}
label {{ font-weight: bold; display: inline-block; width: 160px; }}
.row {{ margin: 12px 0; }}
.box {{ border: 1px solid #bbb; padding: 20px; border-radius: 4px; }}
</style>
</head>
<body>
<h1>Customer Registration Form</h1>
<div class="box">
<div class="row"><label>Full Name:</label> Jane Smith</div>
<div class="row"><label>Email:</label> jane@example.com</div>
<div class="row"><label>Phone:</label> +1 555-0100</div>
<div class="row"><label>Date:</label> {DateTime.Now:yyyy-MM-dd}</div>
</div>
</body>
</html>
""";
// Render HTML to PDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 25;
renderer.RenderingOptions.MarginRight = 25;
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
pdf.SaveAs("CustomerForm.pdf");
Console.WriteLine($"PDF saved -- {pdf.PageCount} page(s).");
Imports IronPdf
' Set your license key once at application startup
License.LicenseKey = "YOUR-LICENSE-KEY"
' Compose an HTML representation of your form data
Dim formHtml As String = $"
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; color: #222; }}
h1 {{ color: #1a4a8a; border-bottom: 2px solid #1a4a8a; padding-bottom: 8px; }}
label {{ font-weight: bold; display: inline-block; width: 160px; }}
.row {{ margin: 12px 0; }}
.box {{ border: 1px solid #bbb; padding: 20px; border-radius: 4px; }}
</style>
</head>
<body>
<h1>Customer Registration Form</h1>
<div class='box'>
<div class='row'><label>Full Name:</label> Jane Smith</div>
<div class='row'><label>Email:</label> jane@example.com</div>
<div class='row'><label>Phone:</label> +1 555-0100</div>
<div class='row'><label>Date:</label> {DateTime.Now:yyyy-MM-dd}</div>
</div>
</body>
</html>
"
' Render HTML to PDF
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 25
renderer.RenderingOptions.MarginRight = 25
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
renderer.RenderingOptions.PrintHtmlBackgrounds = True
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(formHtml)
pdf.SaveAs("CustomerForm.pdf")
Console.WriteLine($"PDF saved -- {pdf.PageCount} page(s).")
ChromePdfRenderer 驱动一个无头 Chromium 引擎,因此 CSS 布局、嵌入式字体,甚至打印媒体查询都能忠实地呈现。 在运行时,将硬编码的字段值替换为从表单控件绑定的数据,从而实现完全动态的方法。 HTML 转 PDF 使用指南详细介绍了所有可用的渲染选项。
如何从表单控件中提取实时数据?
与其手动编写 HTML 代码,不如直接从 WinForms 控件读取值并将其注入到模板中:
using IronPdf;
// Called from a button click handler in your WinForms application
void ExportFormToPdf()
{
// Read control values at the moment of export
string name = txtName.Text;
string email = txtEmail.Text;
string phone = txtPhone.Text;
string notes = rtbNotes.Text.Replace("\n", "<br>");
string html = $"""
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 30px; }}
table {{ width: 100%; border-collapse: collapse; }}
th, td {{ border: 1px solid #ccc; padding: 10px; text-align: left; }}
th {{ background-color: #f0f4ff; }}
h2 {{ color: #1a4a8a; }}
</style>
</head>
<body>
<h2>Form Export -- {DateTime.Now:dd MMM yyyy HH:mm}</h2>
<table>
<tr><th>Field</th><th>Value</th></tr>
<tr><td>Full Name</td><td>{name}</td></tr>
<tr><td>Email</td><td>{email}</td></tr>
<tr><td>Phone</td><td>{phone}</td></tr>
<tr><td>Notes</td><td>{notes}</td></tr>
</table>
</body>
</html>
""";
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// Prompt the user for a save location
using var dialog = new SaveFileDialog();
dialog.Filter = "PDF Files|*.pdf";
dialog.FileName = $"FormExport_{DateTime.Now:yyyyMMdd_HHmmss}.pdf";
if (dialog.ShowDialog() == DialogResult.OK)
{
pdf.SaveAs(dialog.FileName);
MessageBox.Show("PDF exported successfully.", "Export Complete");
}
}
using IronPdf;
// Called from a button click handler in your WinForms application
void ExportFormToPdf()
{
// Read control values at the moment of export
string name = txtName.Text;
string email = txtEmail.Text;
string phone = txtPhone.Text;
string notes = rtbNotes.Text.Replace("\n", "<br>");
string html = $"""
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 30px; }}
table {{ width: 100%; border-collapse: collapse; }}
th, td {{ border: 1px solid #ccc; padding: 10px; text-align: left; }}
th {{ background-color: #f0f4ff; }}
h2 {{ color: #1a4a8a; }}
</style>
</head>
<body>
<h2>Form Export -- {DateTime.Now:dd MMM yyyy HH:mm}</h2>
<table>
<tr><th>Field</th><th>Value</th></tr>
<tr><td>Full Name</td><td>{name}</td></tr>
<tr><td>Email</td><td>{email}</td></tr>
<tr><td>Phone</td><td>{phone}</td></tr>
<tr><td>Notes</td><td>{notes}</td></tr>
</table>
</body>
</html>
""";
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// Prompt the user for a save location
using var dialog = new SaveFileDialog();
dialog.Filter = "PDF Files|*.pdf";
dialog.FileName = $"FormExport_{DateTime.Now:yyyyMMdd_HHmmss}.pdf";
if (dialog.ShowDialog() == DialogResult.OK)
{
pdf.SaveAs(dialog.FileName);
MessageBox.Show("PDF exported successfully.", "Export Complete");
}
}
Imports IronPdf
' Called from a button click handler in your WinForms application
Sub ExportFormToPdf()
' Read control values at the moment of export
Dim name As String = txtName.Text
Dim email As String = txtEmail.Text
Dim phone As String = txtPhone.Text
Dim notes As String = rtbNotes.Text.Replace(vbLf, "<br>")
Dim html As String = $"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 30px; }}
table {{ width: 100%; border-collapse: collapse; }}
th, td {{ border: 1px solid #ccc; padding: 10px; text-align: left; }}
th {{ background-color: #f0f4ff; }}
h2 {{ color: #1a4a8a; }}
</style>
</head>
<body>
<h2>Form Export -- {DateTime.Now:dd MMM yyyy HH:mm}</h2>
<table>
<tr><th>Field</th><th>Value</th></tr>
<tr><td>Full Name</td><td>{name}</td></tr>
<tr><td>Email</td><td>{email}</td></tr>
<tr><td>Phone</td><td>{phone}</td></tr>
<tr><td>Notes</td><td>{notes}</td></tr>
</table>
</body>
</html>
"
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
' Prompt the user for a save location
Using dialog As New SaveFileDialog()
dialog.Filter = "PDF Files|*.pdf"
dialog.FileName = $"FormExport_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"
If dialog.ShowDialog() = DialogResult.OK Then
pdf.SaveAs(dialog.FileName)
MessageBox.Show("PDF exported successfully.", "Export Complete")
End If
End Using
End Sub
这段代码将表单导出视为一个小型报表任务:收集字段值,将其嵌入 HTML 模板中,进行渲染,然后保存到用户选择的位置。 您可以根据表单包含的字段数量来扩展 HTML 表格。 对于多标签表单,为每个标签构建单独的 <section> 块,让 IronPDF 自然分页。
如何添加页眉和页脚?
页眉和页脚使表单导出更加完善,更适合专业用途。 IronPDF 的 TextHeaderFooter 类会在每页的顶部和底部添加文本标记,而不会更改正文 HTML 代码:
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
// Stamp header and footer on every page
pdf.AddTextHeaders(new TextHeaderFooter
{
CenterText = "Confidential -- Internal Use Only",
LeftText = "{date}",
RightText = "Page {page} of {total-pages}",
FontSize = 9,
DrawDividerLine = true
});
pdf.AddTextFooters(new TextHeaderFooter
{
CenterText = "Generated by MyApp v2.0",
FontSize = 8
});
pdf.SaveAs("FormWithHeader.pdf");
using IronPdf;
using IronPdf.Rendering;
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
// Stamp header and footer on every page
pdf.AddTextHeaders(new TextHeaderFooter
{
CenterText = "Confidential -- Internal Use Only",
LeftText = "{date}",
RightText = "Page {page} of {total-pages}",
FontSize = 9,
DrawDividerLine = true
});
pdf.AddTextFooters(new TextHeaderFooter
{
CenterText = "Generated by MyApp v2.0",
FontSize = 8
});
pdf.SaveAs("FormWithHeader.pdf");
Imports IronPdf
Imports IronPdf.Rendering
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(formHtml)
' Stamp header and footer on every page
pdf.AddTextHeaders(New TextHeaderFooter With {
.CenterText = "Confidential -- Internal Use Only",
.LeftText = "{date}",
.RightText = "Page {page} of {total-pages}",
.FontSize = 9,
.DrawDividerLine = True
})
pdf.AddTextFooters(New TextHeaderFooter With {
.CenterText = "Generated by MyApp v2.0",
.FontSize = 8
})
pdf.SaveAs("FormWithHeader.pdf")
动态标记(例如 {page}、{total-pages} 和 {date})会在渲染时自动解析。对于品牌化输出,请将 TextHeaderFooter 替换为 HtmlHeaderFooter,并提供包含公司徽标的完整 HTML 标记。 页眉和页脚使用指南展示了所有可用的标记和布局选项。
如何将表单转换为字节数组而不是文件?
直接保存到磁盘很方便,但许多应用程序需要通过 HTTP 传输 PDF 文件、将其存储在数据库中或将其传递给下游服务。在这些情况下,可以跳过文件,直接处理原始字节:
using IronPdf;
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
// Get raw bytes -- no file required
byte[] pdfBytes = pdf.BinaryData;
// Alternatively, get a MemoryStream for APIs that accept streams
using System.IO.MemoryStream stream = pdf.Stream;
byte[] fromStream = stream.ToArray();
Console.WriteLine($"PDF size in memory: {pdfBytes.Length:N0} bytes");
// Example: return as HTTP response in ASP.NET Core
// return File(pdfBytes, "application/pdf", "form-export.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
// Get raw bytes -- no file required
byte[] pdfBytes = pdf.BinaryData;
// Alternatively, get a MemoryStream for APIs that accept streams
using System.IO.MemoryStream stream = pdf.Stream;
byte[] fromStream = stream.ToArray();
Console.WriteLine($"PDF size in memory: {pdfBytes.Length:N0} bytes");
// Example: return as HTTP response in ASP.NET Core
// return File(pdfBytes, "application/pdf", "form-export.pdf");
Imports IronPdf
Imports System.IO
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(formHtml)
' Get raw bytes -- no file required
Dim pdfBytes As Byte() = pdf.BinaryData
' Alternatively, get a MemoryStream for APIs that accept streams
Using stream As MemoryStream = pdf.Stream
Dim fromStream As Byte() = stream.ToArray()
End Using
Console.WriteLine($"PDF size in memory: {pdfBytes.Length:N0} bytes")
' Example: return as HTTP response in ASP.NET Core
' Return File(pdfBytes, "application/pdf", "form-export.pdf")
BinaryData 属性执行 O(1) 复制预先计算的字节数组。 Stream 属性返回一个新的 MemoryStream,支持对期望流输入的库进行可查找访问——在传递最终字节之前链接压缩或加密时非常有用。 有关内存中 PDF 处理的更多详细信息,请参阅PDF 内存流指南。
如何在保存前应用安全设置?
表单导出数据通常包含敏感数据。 IronPDF 的安全 API 会对 PDF 文件进行加密,并限制接收者对其执行的操作:
using IronPdf;
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
// Restrict access
pdf.SecuritySettings.OwnerPassword = "adminSecretKey";
pdf.SecuritySettings.UserPassword = "viewerPass";
pdf.SecuritySettings.AllowUserPrinting = true; // allow printing
pdf.SecuritySettings.AllowUserCopyPasteContent = false; // block copy
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SaveAs("SecureForm.pdf");
Console.WriteLine("Password-protected PDF created.");
using IronPdf;
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(formHtml);
// Restrict access
pdf.SecuritySettings.OwnerPassword = "adminSecretKey";
pdf.SecuritySettings.UserPassword = "viewerPass";
pdf.SecuritySettings.AllowUserPrinting = true; // allow printing
pdf.SecuritySettings.AllowUserCopyPasteContent = false; // block copy
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SaveAs("SecureForm.pdf");
Console.WriteLine("Password-protected PDF created.");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(formHtml)
' Restrict access
pdf.SecuritySettings.OwnerPassword = "adminSecretKey"
pdf.SecuritySettings.UserPassword = "viewerPass"
pdf.SecuritySettings.AllowUserPrinting = True ' allow printing
pdf.SecuritySettings.AllowUserCopyPasteContent = False ' block copy
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SaveAs("SecureForm.pdf")
Console.WriteLine("Password-protected PDF created.")
设置所有者密码可以让管理员控制权限标志,而用户密码则可以完全控制文档访问权限。 这里 AllowUserPrinting 标志特别重要——您可以让收件人重新打印导出的表单,而无需授予他们编辑权限。 完整详情请参阅PDF 权限和密码指南。
如何比较 C# 表单的打印方法?
在 WinForms 的原生 PrintDocument、GDI+ 位图捕获和 IronPDF 的 HTML 渲染之间进行选择,取决于保真度、复杂性和可移植性之间的权衡:
| 方法 | 输出保真度 | 代码复杂度 | 跨平台 | CSS 支持 | 最适合 |
|---|---|---|---|---|---|
| PrintDocument + PDF 打印机驱动程序 | 中等的 | 中等的 | 仅限 Windows | 无 | 带有现有打印逻辑的旧版 WinForms |
| GDI+ 位图捕获(Control.DrawToBitmap) | 高(栅格) | 低的 | 仅限 Windows | 无 | 快速截屏式捕获 |
| IronPDF HTML 渲染 | 高(矢量) | 低的 | Windows、Linux、macOS、Docker | 完整的 CSS3 | 专业、便携、数据驱动的导出 |
| 报表查看器 (RDLC) | 高的 | 高的 | 仅限 Windows | 数量有限 | 具有分组功能的复杂分页报表 |
IronPDF 基于 HTML 的方法生成的矢量 PDF 输出在任何缩放级别下都能清晰缩放,并在任何设备上都能清晰打印。由于其渲染引擎是 Chromium,因此 CSS 媒体查询、Flexbox 布局和 Google Fonts 都能正常工作——这是 GDI+ 位图捕获无法实现的。 该库还可以在Linux 环境和Docker 容器内运行,使其成为此表中唯一可在 Windows 之外运行的选项。
当表单包含多个选项卡时会发生什么?
多标签 WinForms 在商业应用程序中很常见。 由于 PDF 是从 HTML 而不是从实时 GDI+ 界面生成的,因此您可以精确控制显示哪些选项卡内容。 每个标签页创建一个HTML部分,并在渲染前将它们连接起来。 管道从选项卡 HTML 字符串经由 ChromePdfRenderer 流向单个连续的多页 PDF——每个选项卡一个逻辑部分。 或者,可以分别渲染每个选项卡,然后使用IronPDF 的合并 API合并生成的 PdfDocument 对象。
导出前如何处理表单验证?
仅导出有效的表单数据。 一个简单的保护模式可以防止从不完整的提交中生成 PDF:首先验证字段,只有当所有必需字段都通过验证后,才能继续生成和渲染 HTML。 如果任何字段出错,请在用户界面中突出显示错误并中止导出。 这样可以保持导出的 PDF 文件的一致性,避免因数据不完整而导致后续操作出现混乱。 根据微软关于Windows Forms 验证的文档,ErrorProvider 是在执行任何操作之前进行字段级验证反馈的标准机制。
如何从 ASP.NET Core 提供 PDF 导出服务?
使用 ASP.NET Core 构建的 Web 表单可以使用相同的 ChromePdfRenderer API 导出为 PDF。 渲染后的字节将直接作为文件结果返回:
using IronPdf;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/forms")]
public class FormExportController : ControllerBase
{
[HttpPost("export")]
public IActionResult ExportFormAsPdf([FromBody] FormDataModel formData)
{
// Build HTML from submitted form data
string html = $"""
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; padding: 30px; }}
h1 {{ color: #1a4a8a; }}
dl {{ display: grid; grid-template-columns: 200px 1fr; gap: 8px 16px; }}
dt {{ font-weight: bold; }}
</style>
</head>
<body>
<h1>{formData.FormTitle}</h1>
<dl>
<dt>Applicant Name</dt><dd>{formData.ApplicantName}</dd>
<dt>Submission Date</dt><dd>{DateTime.UtcNow:dd MMM yyyy}</dd>
<dt>Reference ID</dt><dd>{formData.ReferenceId}</dd>
</dl>
</body>
</html>
""";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
byte[] pdfBytes = pdf.BinaryData;
string fileName = $"form-{formData.ReferenceId}-{DateTime.UtcNow:yyyyMMdd}.pdf";
return File(pdfBytes, "application/pdf", fileName);
}
}
public record FormDataModel(string FormTitle, string ApplicantName, string ReferenceId);
using IronPdf;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/forms")]
public class FormExportController : ControllerBase
{
[HttpPost("export")]
public IActionResult ExportFormAsPdf([FromBody] FormDataModel formData)
{
// Build HTML from submitted form data
string html = $"""
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; padding: 30px; }}
h1 {{ color: #1a4a8a; }}
dl {{ display: grid; grid-template-columns: 200px 1fr; gap: 8px 16px; }}
dt {{ font-weight: bold; }}
</style>
</head>
<body>
<h1>{formData.FormTitle}</h1>
<dl>
<dt>Applicant Name</dt><dd>{formData.ApplicantName}</dd>
<dt>Submission Date</dt><dd>{DateTime.UtcNow:dd MMM yyyy}</dd>
<dt>Reference ID</dt><dd>{formData.ReferenceId}</dd>
</dl>
</body>
</html>
""";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
byte[] pdfBytes = pdf.BinaryData;
string fileName = $"form-{formData.ReferenceId}-{DateTime.UtcNow:yyyyMMdd}.pdf";
return File(pdfBytes, "application/pdf", fileName);
}
}
public record FormDataModel(string FormTitle, string ApplicantName, string ReferenceId);
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/forms")>
Public Class FormExportController
Inherits ControllerBase
<HttpPost("export")>
Public Function ExportFormAsPdf(<FromBody> formData As FormDataModel) As IActionResult
' Build HTML from submitted form data
Dim html As String = $"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; padding: 30px; }}
h1 {{ color: #1a4a8a; }}
dl {{ display: grid; grid-template-columns: 200px 1fr; gap: 8px 16px; }}
dt {{ font-weight: bold; }}
</style>
</head>
<body>
<h1>{formData.FormTitle}</h1>
<dl>
<dt>Applicant Name</dt><dd>{formData.ApplicantName}</dd>
<dt>Submission Date</dt><dd>{DateTime.UtcNow:dd MMM yyyy}</dd>
<dt>Reference ID</dt><dd>{formData.ReferenceId}</dd>
</dl>
</body>
</html>
"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
Dim pdfBytes As Byte() = pdf.BinaryData
Dim fileName As String = $"form-{formData.ReferenceId}-{DateTime.UtcNow:yyyyMMdd}.pdf"
Return File(pdfBytes, "application/pdf", fileName)
End Function
End Class
Public Class FormDataModel
Public Property FormTitle As String
Public Property ApplicantName As String
Public Property ReferenceId As String
Public Sub New(formTitle As String, applicantName As String, referenceId As String)
Me.FormTitle = formTitle
Me.ApplicantName = applicantName
Me.ReferenceId = referenceId
End Sub
End Class
该控制器接收 JSON 格式的表单数据,在内存中生成 PDF,并将其作为文件下载流式传输回去。 服务器上不会创建任何临时文件。 对于Blazor 应用程序,方法类似——从服务中调用相同的渲染代码,并通过 IJSRuntime 将字节推送到浏览器。 完整的 ASP.NET 集成模式记录在ASP.NET 到 PDF 指南中。
应该使用哪种 MIME 类型和内容处置方式?
始终返回 application/pdf 作为内容类型。 使用 Content-Disposition: inline 在浏览器中显示 PDF,或使用 Content-Disposition: attachment 强制下载。 使用 attachment 时,文件名会显示在浏览器的保存对话框中,因此请选择一个包含参考 ID 或日期的有意义的名称。
如何缓存生成的PDF文件?
如果重复请求相同的表单导出,则缓存字节数组以避免重新渲染。 IMemoryCache 适用于单服务器部署; 对于多实例设置,可以使用分布式缓存,例如 Redis。 设置一个与底层表单数据更改频率相一致的过期时间。
表单导出为 PDF 的最佳实践是什么?
稳定、高质量的表单导出源于几个可重复的模式:
-保持 HTML 代码简洁。避免使用大量 JavaScript 的模板——纯 HTML 和 CSS 渲染速度更快,生成的 PDF 文件更小。 仅当表单计算依赖于 RenderingOptions.EnableJavaScript 时才启用它。
-使用打印 CSS。在样式表中设置 CssMediaType = PdfCssMediaType.Print 并定义 @media print 规则。 这样可以从导出的 PDF 中删除仅显示在屏幕上的边框,例如导航栏和侧边栏。
-对用户输入进行清理。对注入到模板中的任何字段值中的 HTML 实体进行转义,以防止出现损坏的标记,或在极端情况下防止脚本注入到 PDF 中。
-释放 PdfDocument 对象。非托管资源将一直保留到被释放为止。 保存后,请使用 using 声明或显式调用 Dispose()。
-使用生产数据进行测试。包含长文本、特殊字符或嵌入式图像的表单可能会产生意想不到的布局。 在开发过程中,使用真实数据样本运行导出操作。
渲染选项参考文档列出了所有可用的设置,从自定义纸张尺寸到自定义页边距和页面方向。
如何处理大型或多页表单?
IronPDF 会根据内容高度和所选纸张尺寸自动分页。如果希望新的表单部分始终从新的一页开始,请在 CSS 的节容器中插入 page-break-before: always。 对于有数百个字段的表单,预先分配一个具有估计容量的 MemoryStream 可以减少字节数组复制期间的 GC 压力。
如何添加数字签名?
在许多司法管辖区,签署的出口文件具有法律效力。 IronPDF 支持存储在 PFX 文件或 Windows 证书存储中的数字证书:
// Load the certificate and sign in one step
var signature = new IronPdf.Signing.PdfSignature("certificate.pfx", "certPassword");
pdf.Sign(signature);
pdf.SaveAs("SignedForm.pdf");
// Load the certificate and sign in one step
var signature = new IronPdf.Signing.PdfSignature("certificate.pfx", "certPassword");
pdf.Sign(signature);
pdf.SaveAs("SignedForm.pdf");
Imports IronPdf.Signing
' Load the certificate and sign in one step
Dim signature As New PdfSignature("certificate.pfx", "certPassword")
pdf.Sign(signature)
pdf.SaveAs("SignedForm.pdf")
根据Adobe PDF 数字签名概述,数字签名可以证明文档的来源,并检测签名后所做的任何修改。 PDF 数字签名指南详细介绍了证书配置和可见签名域。
你应该记住哪些关键点?
使用 IronPDF 将 C# Windows 窗体转换为 PDF 简化为三个步骤:构建表单数据的 HTML 表示形式,将其传递给 ChromePdfRenderer,然后保存或传输结果。 该方法生成的矢量 PDF 打印清晰,可跨平台运行,并支持完整的 CSS3 布局模型——这些优势是 GDI+ 位图捕获和传统打印驱动程序方法无法比拟的。
本指南涵盖的核心功能:
- 使用
ChromePdfRenderer为 WinForms 和 ASP.NET Core 实现 HTML 到 PDF 的渲染 - 将 WinForms 控件中的实时数据绑定到 HTML 模板
- 页眉、页脚和页码使用
TextHeaderFooter - 通过
BinaryData输出内存字节数组,用于 HTTP 响应和数据库存储 - PDF 安全设置:所有者/用户密码和权限标志
- 用于具有法律约束力的出口的数字签名附件
探索IronPDF 的功能集,了解注释工具、表单字段编辑、PDF/A 合规性等。 立即免费试用 IronPDF 的30 天试用许可证,并将其应用到您自己的表单导出工作流程中。
常见问题解答
如何使用IronPDF将C#表单转换为PDF?
您可以通过利用其直观的API将C#表单转换为PDF,该API允许您高效处理PDF转换,无需复杂代码。
为什么在.NET应用中将PDF文档转换为字节数组很重要?
将PDF文档转换为字节数组很重要,因为这可以启用数据库中的PDF存储,通过API传输,以及内存中处理文档内容,这些都是现代.NET应用程序中的关键操作。
使用IronPDF进行字节数组转换有哪些好处?
IronPDF通过提供简易使用的API简化了字节数组转换,简化了流程,减少了复杂代码的需求,提高了开发效率。
IronPDF能否在内存中处理PDF转换?
是的,IronPDF可以在内存中处理PDF转换,让开发者无需将文件保存到磁盘即可管理文档内容。
使用IronPDF将PDF存储在数据库中是否可能?
是的,您可以通过使用IronPDF将PDF转换为字节数组,从而无缝集成数据库系统。
IronPDF如何帮助通过API传输PDF文件?
IronPDF通过将PDF转换为字节数组,简化了通过API传输PDF文件,使其更易于通过网络协议发送和接收文档数据。
是什么使IronPDF的API对开发者来说直观?
IronPDF的API专为开发者设计为直观,提供清晰明了的方法,简化复杂的PDF操作,提升生产力并缩短学习曲线。



