使用IronPDF將C#表單打印為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")
根據AdAdobe 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?
您可以使用 IronPDF 透過其直覺的 API 將 C# 表單轉換為 PDF,從而高效地處理 PDF 轉換而無需編寫複雜的程式碼。
在 .NET 應用程式中,為什麼將 PDF 文件轉換為位元組數組很重要?
將 PDF 文件轉換為位元組數組非常重要,因為它能夠將 PDF 儲存在資料庫中,透過 API 進行傳輸,以及在記憶體中處理文件內容,這些都是現代 .NET 應用程式中的關鍵操作。
使用 IronPDF 進行位元組數組轉換有哪些好處?
IronPDF 透過提供易於使用的 API 簡化位元組數組轉換,從而簡化了這個過程,減少了對複雜程式碼的需求,並提高了開發效率。
IronPDF能否在記憶體中進行PDF轉換?
是的,IronPDF 可以在記憶體中處理 PDF 轉換,使開發人員能夠管理文件內容而無需將文件儲存到磁碟。
是否可以使用 IronPDF 將 PDF 檔案儲存到資料庫中?
是的,您可以使用 IronPDF 將 PDF 檔案轉換為位元組數組,然後將其儲存在資料庫中,這樣可以輕鬆地與資料庫系統無縫整合。
IronPDF 如何透過 API 協助傳輸 PDF 檔案?
IronPDF 透過 API 幫助傳輸 PDF 文件,它能夠將 PDF 文件轉換為位元組數組,從而更容易透過網路協定發送和接收文件資料。
IronPDF 的 API 對開發者來說有哪些直覺之處?
IronPDF 的 API 旨在為開發人員提供直覺易懂的方法,簡化複雜的 PDF 操作,提高生產力並降低學習難度。



