如何在UWP應用程式中使用C#構建PDF編輯器
在C#中將Windows Form列印成PDF非常簡單,使用IronPDF:使用ChromePdfRenderer渲染表單的HTML表示,然後儲存到磁碟或記憶體中,僅需幾行程式碼即可生成完美無瑕的PDF。
將Windows Forms應用程式匯出為PDF是業務軟體中的常見需求。 無論您是需要存檔資料輸入畫面、從表單狀態生成面向客戶的報告,還是無需接觸列印機即可捕獲列印預覽,將C#表單轉換為PDF可以消除日常工作流程中的摩擦。 IronPDF提供了一個.NET本機的API,可處理從HTML渲染到最終PDF輸出的轉換流程,讓您避免使用易碎的GDI+列印技巧。
如何安裝IronPDF?
通過NuGet將IronPDF新增到您的專案中。 打開套件管理控制台並運行:
Install-Package IronPdf
或者使用.NET CLI:
dotnet add package IronPdf
安裝後,在任何調用API的文件頂部新增using IronPdf;。 這個套件也可以直接從NuGet.org/packages/IronPdf獲得。 您可以在ironpdf.com/licensing/獲得免費試用授權金鑰,以便在評估期間解除掉不帶水印的輸出。
如何使用HTML將Windows Form轉換為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-to-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表格。 對於多標籤表單,每個標籤建立獨立的塊,讓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")
動態標籤如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)拷貝預計算的字節陣列。 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 | None | 具有現有列印邏輯的舊版WinForms |
| GDI+位圖捕獲(Control.DrawToBitmap) | 高(光柵化) | 低 | 僅支持Windows | None | 快速截圖風格的捕獲 |
| IronPDF HTML渲染 | 高(矢量) | 低 | Windows,Linux,macOS,Docker | 完整CSS3 | 專業、可攜帶、資料驅動的匯出 |
| ReportViewer(RDLC) | 高 | 高 | 僅支持Windows | 有限 | 具有分組的複雜分頁報告 |
IronPDF的基於HTML的方法生成的矢量PDF輸出可以在任何縮放級別中清晰顯示,並在任何裝置上都能列印出色。因為渲染引擎是Chromium,CSS媒體查詢、flexbox佈局和Google字體都能正常工作——這些都是GDI+位圖捕獲無法複製的。 此程式庫還能在Linux環境和Docker容器中運行,是此表中唯一可在Windows以外工作的選項。
當表單有多個標籤時會發生什麼?
多標籤的WinForms在業務應用中很常見。 由於PDF是從HTML生成而不是從即時GDI+表面生成,您完全可以控制哪些標籤內容顯示。 每個標籤構建一個HTML部分,並在渲染前將它們連接起來。 從標籤HTML字串通過ChromePdfRenderer到單個、連續的多頁PDF——每個標籤一個邏輯部分。 或者,單獨渲染每個標籤,然後使用IronPDF的合併API合併生成的PdfDocument物件。
如何在匯出前處理表單驗證?
僅匯出有效的表單資料。 簡單的保護模式防止從不完整的提交中生成PDF:首先驗證字段,僅當所有必填字段通過時才進行HTML生成和渲染。 如果任何字段不合格,則在UI中突出錯誤並中止匯出。 這保持匯出的PDF一致,並避免從部分資料造成下游混亂。 根據微軟在Windows表單驗證上的文件,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: attachment強制觸發下載。 当使用attachment時,文件名稱會出現在瀏覽器的保存對話框中,請選擇一個有意義的名稱,包含一個參考ID或日期。
如何快取生成的PDF?
如果同一表單匯出被反复要求,快取字節陣列以避免重新渲染。 IMemoryCache 適用於單伺服器部署; 對於多實例設置,請使用如Redis的分布式快取。 設置與基礎表單資料更改頻率一致的過期時間。
表單到PDF匯出的最佳實踐是什麼?
一致的、高質量的表單匯出來自於一些可重複的模式:
- 保持HTML簡單。避免使用JavaScript繁重的模板——純HTML和CSS渲染更快並產生更小的PDF。 僅當表單計算依賴於它時啟用
RenderingOptions.EnableJavaScript。 - 使用列印CSS。設置
@media print规则。 這可以消除螢幕專用的chrome,如導航條和側邊欄,從匯出的PDF中移除。 - 淨化使用者輸入。在您注入模板的任何字段值中轉義HTML實體,以防止損壞的標記,或在邊緣案例中,防止腳本注入到PDF中。
- 處置PdfDocument物件。非管理資源將被保留直到處置。 使用
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 Form轉換為PDF簡化為三個步驟:構建表單資料的HTML表示,將其傳遞給ChromePdfRenderer,然後保存或傳輸結果。 該方法生成的矢量PDF列印清晰,在不同平台上都能工作,並支持完整的CSS3佈局模型——這些都是GDI+位圖捕捉和舊版列印驅動方法無法媲美的優勢。
本指南涵蓋的關鍵功能:
- 使用
ChromePdfRenderer進行HTML-to-PDF渲染,適用於WinForms和ASP.NET Core - 從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 應用程式中的關鍵操作。
using IronPDF 進行位元組陣列轉換有哪些好處?
IronPDF 簡化了位元組陣列轉換,提供了一個易於使用的 API,簡化了流程,減少了對複雜程式碼的需求並改善了開發效率。
IronPDF 可以在記憶體中進行 PDF 轉換嗎?
可以,IronPDF 可以在記憶體中進行 PDF 轉換,允許開發者管理文件內容而無需將檔案儲存到磁碟。
using IronPDF 可以將 PDFs 儲存在資料庫中嗎?
可以,您可以通過使用 IronPDF 將 PDFs 轉換為位元組陣列來將其儲存在資料庫中,這有助於與資料庫系統的無縫整合。
IronPDF 如何協助通過 API 傳輸 PDF 檔案?
IronPDF 通過允許將 PDFs 轉換為位元組陣列來協助通過 API 傳輸 PDF 檔案,使得更容易通過網路協議發送和接收文件資料。
IronPDF 的 API 對於開發者而言有何直觀之處?
IronPDF 的 API 為開發者提供清晰和直接的方法,簡化了複雜的 PDF 操作,提高了生產力並縮短了學習曲線。

