使用IRONPDF C#创建PDF(代码示例教程) Jacob Mellor 已更新:八月 31, 2025 Download IronPDF NuGet 下载 DLL 下载 Windows 安装程序 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article 在 C# 中创建 PDF 是现代 .NET 开发人员的一项基本技能,无论您是在构建财务报告、生成医疗保健文件还是制作电子商务收据。使用正确的 .NET PDF 库,您可以仅通过几行代码将 HTML 内容转换为专业的 PDF 文件,从而完全控制文档结构和外观。 IronPDF 是迄今为止最简单、最实用的 .NET PDF 创建库,学习曲线非常容易,让您在几分钟内而不是小时内生成 PDF。 本综合指南将向您展示如何在 C# 中使用IronPDF创建 PDF 文档——这是一种强大的 C# PDF 生成器,可以产生像素级精确的结果,并支持所有现代 .NET 平台,包括 2025 年 11 月即将发布的.NET 10。当本教程涵盖从最简单的用例到最复杂的 PDF 生成场景时,请不要被吓倒——从头开始并向前推进。 您将学习多种生成 PDF 的方法,从简单的 HTML 字符串到复杂的多页报告,以及如何排查常见问题并优化各种 PDF 生成任务的性能。 role="alert"> 当您需要帮助时,IronPDF 的支持团队由真正的工程师组成,他们了解您的挑战。凭借 24/7 实时聊天支持和通常都在 30 秒之内的响应时间,您永远不会干等着等待答案。正是这种支持水平使得开发人员一致认为IronPDF的支持是行业中最佳的。支持团队可以帮你处理从 快速入门:在 C# 中创建您的第一个 PDF(不到 2 分钟) 想要立即生成 PDF 吗? 让我们创建一个简单但功能齐全的 PDF 文档,演示 .NET 中现代 PDF 生成的强大功能。 首先 通过 NuGet 包管理器安装 IronPDF——这个单一的软件包包含开始立即创建 PDF 所需的一切。IronPDF对开发是免费的,因此您可以在决定许可之前试用所有功能。 Install-Package IronPdf 现在让我们使用 C# 创建 PDF 内容: using IronPdf; // Instantiate the PDF generator - this is your gateway to PDF creation var renderer = new ChromePdfRenderer(); // Create a PDF from HTML string - yes, it's really this simple! var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>PDF generated successfully!</p>"); // Save your newly created PDF document pdf.SaveAs("my-first-pdf.pdf"); Console.WriteLine("PDF generated successfully!"); using IronPdf; // Instantiate the PDF generator - this is your gateway to PDF creation var renderer = new ChromePdfRenderer(); // Create a PDF from HTML string - yes, it's really this simple! var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>PDF generated successfully!</p>"); // Save your newly created PDF document pdf.SaveAs("my-first-pdf.pdf"); Console.WriteLine("PDF generated successfully!"); Imports IronPdf ' Instantiate the PDF generator - this is your gateway to PDF creation Private renderer = New ChromePdfRenderer() ' Create a PDF from HTML string - yes, it's really this simple! Private pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>PDF generated successfully!</p>") ' Save your newly created PDF document pdf.SaveAs("my-first-pdf.pdf") Console.WriteLine("PDF generated successfully!") $vbLabelText $csharpLabel 就是这样! 您刚刚 在 C# 中创建了第一个 PDF 文档。 无需学习复杂的 PDF API,无需安装服务器依赖项,无需掌握低级 PDF 命令。 只需 HTML 输入,PDF 输出 - 就是 PDF 生成的方式。 但这只是开始 - 让我们探索为何这种方法如此强大以及您如何创建更复杂的 PDF 文档。 如何在 C# 中创建 PDF:快速概述 要在 C# 中创建 PDF,您可以使用像 IronPDF、QuestPDF 或 PDFsharp 这样的第三方库。这些库提供了各种功能,包括从头创建 PDF、将 HTML 转换为 PDF 等。 以下是此过程的一般纲要: 安装 PDF 库:在 Visual Studio 中使用 NuGet 包管理器安装合适的库。 创建新 PDF 文档:实例化 PDF 文档对象。 添加内容:向文档中添加页面、文本、图像和其他元素。 保存文档:指定文件路径并保存 PDF。 以下是使用IronPDF的示例: using IronPdf; public class Example { public static void CreatePdf() { // Create a new PDF document var pdf = new ChromePdfRenderer(); // Add some text string htmlContent = "<h1>Hello, PDF!</h1><p>This is a dynamically created PDF.</p>"; // Render HTML to PDF var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent); // Save the PDF pdfDocument.SaveAs("MyDynamicPdf.pdf"); } } using IronPdf; public class Example { public static void CreatePdf() { // Create a new PDF document var pdf = new ChromePdfRenderer(); // Add some text string htmlContent = "<h1>Hello, PDF!</h1><p>This is a dynamically created PDF.</p>"; // Render HTML to PDF var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent); // Save the PDF pdfDocument.SaveAs("MyDynamicPdf.pdf"); } } Imports IronPdf Public Class Example Public Shared Sub CreatePdf() ' Create a new PDF document Dim pdf = New ChromePdfRenderer() ' Add some text Dim htmlContent As String = "<h1>Hello, PDF!</h1><p>This is a dynamically created PDF.</p>" ' Render HTML to PDF Dim pdfDocument = pdf.RenderHtmlAsPdf(htmlContent) ' Save the PDF pdfDocument.SaveAs("MyDynamicPdf.pdf") End Sub End Class $vbLabelText $csharpLabel 现在,让我们更深入地探讨为什么开发人员需要创建 PDF 以及IronPDF如何让这个过程简单而强大。 开发人员为什么需要在 C# 中创建 PDF? 以编程方式创建 PDF 可以让 C# 打开自动化文档生成和简化业务流程的无限可能。IronPDF已被全球超过 1400 万已安装的开发者所信赖,因为它为 .NET 中构建 PDF 提供了无与伦比的可靠性和使用便利性。 在金融领域,开发人员使用 C# 创建 PDF 发票、报表和需要精准格式化和安全功能的合规报告。 <strong>医疗保健机构</strong> 生成患者记录、实验室结果和保险表单,确保文档完整性和 HIPAA 合规性。 电子商务平台生成 PDF 收据,带有 QR 码的运输标签和门票(使用 IronQR 等工具)直接嵌入 PDF 中。 以编程方式操控 PDF 文档意味着您可以创建、修改和在无需人工干预的情况下保护大量文档。 使用像IronPDF这样的现代 .NET PDF 库 的好处是它可以 无缝集成 到您组织现有工作流程中。 Whether you're converting Word documents from your business users, transforming Markdown documentation from your development team, or generating PDFs from web-based reports,IronPDFhandles it all. 这种组织灵活性是各公司选择在.NET中程序化PDF 生成的原因 - 它消除了手动创建文档、减少了错误、确保了所有生成的 PDF的一致性,并节省了员工的大量时间。您无需学习专有的 PDF 语法或手动定位每个元素,可以使用 HTML 和 CSS 来设计您的文档。 这种方法大大缩短了开发时间,确保您的生成的 PDF在所有方面保持一致的品牌形象。 无论您是创建单页发票还是复杂的多章节报告,原则保持不变 - 设计 HTML,用 C# 生成 PDF。 在你的 C# 项目中设置 IronPDF 在深入创建 PDF 之前,让我们确保您的开发环境 恰当地配置 以获得最佳的PDF生成效果。IronPDF支持所有现代 .NET 版本,包括 .NET 8、.NET 9,并且已经符合将在 2025 年 11 月发布的 .NET 10 版(Iron Software 与 .NET Foundation 和 Microsoft 紧密合作,确保第一天兼容性)。 设置过程很简单,但了解选项有助于您为您的特定需求选择 最佳方法。 安装方法 方法 1:Visual Studio 包管理器(初学者推荐) 开始使用IronPDF的最简单方式是通过 Visual Studio 的内置 NuGet 包管理器。 这个图形界面让您可以轻松浏览、安装和管理您的 PDF 生成依赖项: 1.在解决方案资源管理器中右键单击您的项目 2.选择 "管理 NuGet 软件包"。 3.点击 "浏览 "并搜索 "IronPDF" 选择 Iron Software 提供的 IronPdf 包 点击安装并接受许可协议 方法 2:软件包管理器控制台 对于喜欢命令行工具的开发者,包管理器控制台提供了快速安装IronPDF的方法: Install-Package IronPdf 方法 3:.NET CLI(用于跨平台开发) 如果您正在 macOS、Linux 上工作,或者更喜欢 .NET CLI,请在您的项目目录下使用此命令: dotnet add package IronPdf 选择合适的软件包 IronPDF 提供了适用于不同部署场景的各种 NuGet 包。 了解这些选项有助于您最小化部署规模并优化性能: IronPdf:包含所有需要的标准包,适用于 Windows、macOS 和 Linux。 适合大多数应用。 IronPdf.Slim:一个轻量级基础包,在运行时下载特定平台组件。非常适合云部署,适用对包大小有要求的场景。 IronPdf.Linux:专为 Linux 部署而优化,已预打包所有必需的依赖项。 IronPdf.MacOs:为 macOS 环境量身定制,并具有原生 Apple Silicon 支持。 请注意对于Azure、AWS或Docker上的云部署,考虑使用IronPdf.Slim以减少容器大小。所需的组件将在首次使用时自动下载。 验证您的安装 安装完成后,使用此简单测试验证一切正常,创建一个新文档: using IronPdf; using System.IO; // Test yourIronPDFinstallation var renderer = new ChromePdfRenderer(); var testPdf = renderer.RenderHtmlAsPdf("<p>Installation test successful!</p>"); testPdf.SaveAs("test.pdf"); if (File.Exists("test.pdf")) { Console.WriteLine("IronPDF installed and working correctly!"); } using IronPdf; using System.IO; // Test yourIronPDFinstallation var renderer = new ChromePdfRenderer(); var testPdf = renderer.RenderHtmlAsPdf("<p>Installation test successful!</p>"); testPdf.SaveAs("test.pdf"); if (File.Exists("test.pdf")) { Console.WriteLine("IronPDF installed and working correctly!"); } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 在 C# 中生成 PDF 的不同方法是什么? IronPDF 提供了多种途径来构建 PDF 文档,适用于不同的场景和需求。 了解这些方法有助于您为特定用例选择最有效的方法, 在需要生成 PDF 的时候。 无论您是在从头开始创建 PDF,转换现有文件,还是捕获实时的在线内容,IronPDF 作为全面的 C# PDF 生成器 都能满足您的需求。 让我们逐一探讨每种方法,伴随实际应用的实用案例,展示在 C# 中创建 PDF 的现实应用。 1. 从 HTML 字符串创建 PDF(最灵活) 从 HTML 字符串创建 PDF 可以让您 完全控制 最终文档的内容和样式,当您需要 将 HTML 内容 转换为 PDF 格式时,这种方法最适合生成动态报告、发票或任何根据数据变动的文档。 您可以使用包括 flexbox 和 grid 布局在内的现代 HTML5 和 CSS3 特性将 HTML 内容转换为专业 PDF 文件。 动态转换 HTML 内容的能力使这是 C# 中 PDF 创建 的最通用方法: ### 2. 从网址生成 PDF(网页捕获) using IronPdf; using System; using System.Linq; var renderer = new ChromePdfRenderer(); // Build dynamic content with data var customerName = "Acme Corporation"; var orderDate = DateTime.Now; var items = new[] { new { Name = "Widget Pro", Price = 99.99m }, new { Name = "Gadget Plus", Price = 149.99m } }; // Create HTML with embedded data and modern CSS var html = $@" <html> <head> <style> body {{ font-family: 'Segoe UI', Arial, sans-serif; margin: 40px; color: #333; }} .invoice-header {{ display: flex; justify-content: space-between; border-bottom: 2px solid #0066cc; padding-bottom: 20px; }} .items-table {{ width: 100%; margin-top: 30px; border-collapse: collapse; }} .items-table th {{ background: #f0f0f0; padding: 10px; text-align: left; }} </style> </head> <body> <div class='invoice-header'> <div> <h1>Invoice</h1> <p>Customer: {customerName}</p> </div> <div> <p>Date: {orderDate:yyyy-MM-dd}</p> <p>Invoice #: INV-{orderDate:yyyyMMdd}-001</p> </div> </div> <table class='items-table'> <thead> <tr> <th>Item</th> <th>Price</th> </tr> </thead> <tbody>"; foreach (var item in items) { html += $@" <tr> <td>{item.Name}</td> <td>${item.Price:F2}</td> </tr>"; } html += @" </tbody> </table> </body> </html>"; // Generate the PDF document var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"invoice-{orderDate:yyyyMMdd}.pdf"); using IronPdf; using System; using System.Linq; var renderer = new ChromePdfRenderer(); // Build dynamic content with data var customerName = "Acme Corporation"; var orderDate = DateTime.Now; var items = new[] { new { Name = "Widget Pro", Price = 99.99m }, new { Name = "Gadget Plus", Price = 149.99m } }; // Create HTML with embedded data and modern CSS var html = $@" <html> <head> <style> body {{ font-family: 'Segoe UI', Arial, sans-serif; margin: 40px; color: #333; }} .invoice-header {{ display: flex; justify-content: space-between; border-bottom: 2px solid #0066cc; padding-bottom: 20px; }} .items-table {{ width: 100%; margin-top: 30px; border-collapse: collapse; }} .items-table th {{ background: #f0f0f0; padding: 10px; text-align: left; }} </style> </head> <body> <div class='invoice-header'> <div> <h1>Invoice</h1> <p>Customer: {customerName}</p> </div> <div> <p>Date: {orderDate:yyyy-MM-dd}</p> <p>Invoice #: INV-{orderDate:yyyyMMdd}-001</p> </div> </div> <table class='items-table'> <thead> <tr> <th>Item</th> <th>Price</th> </tr> </thead> <tbody>"; foreach (var item in items) { html += $@" <tr> <td>{item.Name}</td> <td>${item.Price:F2}</td> </tr>"; } html += @" </tbody> </table> </body> </html>"; // Generate the PDF document var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"invoice-{orderDate:yyyyMMdd}.pdf"); Imports IronPdf Imports System Imports System.Linq Private renderer = New ChromePdfRenderer() ' Build dynamic content with data Private customerName = "Acme Corporation" Private orderDate = DateTime.Now Private items = { New With { Key .Name = "Widget Pro", Key .Price = 99.99D }, New With { Key .Name = "Gadget Plus", Key .Price = 149.99D } } ' Create HTML with embedded data and modern CSS Private html = $" <html> <head> <style> body {{ font-family: 'Segoe UI', Arial, sans-serif; margin: 40px; color: #333; }} .invoice-header {{ display: flex; justify-content: space-between; border-bottom: 2px solid #0066cc; padding-bottom: 20px; }} .items-table {{ width: 100%; margin-top: 30px; border-collapse: collapse; }} .items-table th {{ background: #f0f0f0; padding: 10px; text-align: left; }} </style> </head> <body> <div class='invoice-header'> <div> <h1>Invoice</h1> <p>Customer: {customerName}</p> </div> <div> <p>Date: {orderDate:yyyy-MM-dd}</p> <p>Invoice #: INV-{orderDate:yyyyMMdd}-001</p> </div> </div> <table class='items-table'> <thead> <tr> <th>Item</th> <th>Price</th> </tr> </thead> <tbody>" For Each item In items html += $" <tr> <td>{item.Name}</td> <td>${item.Price:F2}</td> </tr>" Next item html &= " </tbody> </table> </body> </html>" ' Generate the PDF document Dim pdf = renderer.RenderHtmlAsPdf(html) pdf.SaveAs($"invoice-{orderDate:yyyyMMdd}.pdf") $vbLabelText $csharpLabel 有时候您需要将现有网页转换为 PDF 文件,这种方法适合用于归档、报告或创建在线内容的离线版本。 IronPDF 的 URL 到 PDF 转换使用了 真实的 Chromium 引擎,确保复杂、JavaScript 重度的站点正确渲染。 这种方法对于创建仪表板快照、保存在线收据或记录基于网络的报告是非常有价值的: 3. 从 HTML 文件创建 PDF(基于模板的生成) using IronPdf; var renderer = new ChromePdfRenderer(); // Configure rendering options for optimal capture renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 25; renderer.RenderingOptions.MarginBottom = 25; // Wait for JavaScript to fully load (important for SPAs) renderer.RenderingOptions.RenderDelay = 2000; // 2 seconds // Enable JavaScript execution renderer.RenderingOptions.EnableJavaScript = true; // Capture a web page as PDF var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard"); pdf.SaveAs("dashboard-capture.pdf"); // For authenticated pages, you can set cookies var cookieManager = renderer.RenderingOptions.CustomCookies; cookieManager["session_id"] = "your-session-token"; // Capture authenticated content var securePdf = renderer.RenderUrlAsPdf("https://app.example.com/private/report"); securePdf.SaveAs("private-report.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); // Configure rendering options for optimal capture renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 25; renderer.RenderingOptions.MarginBottom = 25; // Wait for JavaScript to fully load (important for SPAs) renderer.RenderingOptions.RenderDelay = 2000; // 2 seconds // Enable JavaScript execution renderer.RenderingOptions.EnableJavaScript = true; // Capture a web page as PDF var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard"); pdf.SaveAs("dashboard-capture.pdf"); // For authenticated pages, you can set cookies var cookieManager = renderer.RenderingOptions.CustomCookies; cookieManager["session_id"] = "your-session-token"; // Capture authenticated content var securePdf = renderer.RenderUrlAsPdf("https://app.example.com/private/report"); securePdf.SaveAs("private-report.pdf"); Imports IronPdf Private renderer = New ChromePdfRenderer() ' Configure rendering options for optimal capture renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 renderer.RenderingOptions.MarginTop = 25 renderer.RenderingOptions.MarginBottom = 25 ' Wait for JavaScript to fully load (important for SPAs) renderer.RenderingOptions.RenderDelay = 2000 ' 2 seconds ' Enable JavaScript execution renderer.RenderingOptions.EnableJavaScript = True ' Capture a web page as PDF Dim pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard") pdf.SaveAs("dashboard-capture.pdf") ' For authenticated pages, you can set cookies Dim cookieManager = renderer.RenderingOptions.CustomCookies cookieManager("session_id") = "your-session-token" ' Capture authenticated content Dim securePdf = renderer.RenderUrlAsPdf("https://app.example.com/private/report") securePdf.SaveAs("private-report.pdf") $vbLabelText $csharpLabel 基于模板的 PDF 生成是一个理想方法,当您有 复杂布局 时,设计人员可以独立于您的应用程序代码进行维护。 通过将 HTML 模板存储为文件,您可以使设计与逻辑之间 清洁分隔。 这种方法在生成一致的文件如证书、合同或标准化报告时尤其有效: 4. 将 Markdown 转换为 PDF using IronPdf; using System.IO; using System; var renderer = new ChromePdfRenderer(); // Basic file conversion var pdf = renderer.RenderHtmlFileAsPdf("Templates/certificate-template.html"); pdf.SaveAs("certificate.pdf"); // Advanced: Using templates with asset directories // Perfect when your HTML references images, CSS, or JavaScript files var basePath = Path.Combine(Directory.GetCurrentDirectory(), "Templates", "Assets"); var pdfWithAssets = renderer.RenderHtmlFileAsPdf( "Templates/report-template.html", basePath //IronPDFwill resolve relative paths from here ); // Even better: Template with placeholders var templateHtml = File.ReadAllText("Templates/contract-template.html"); templateHtml = templateHtml .Replace("{{ClientName}}", "Tech Innovations Inc.") .Replace("{{ContractDate}}", DateTime.Now.ToString("MMMM dd, yyyy")) .Replace("{{ContractValue}}", "$50,000"); var contractPdf = renderer.RenderHtmlAsPdf(templateHtml); contractPdf.SaveAs("contract-final.pdf"); using IronPdf; using System.IO; using System; var renderer = new ChromePdfRenderer(); // Basic file conversion var pdf = renderer.RenderHtmlFileAsPdf("Templates/certificate-template.html"); pdf.SaveAs("certificate.pdf"); // Advanced: Using templates with asset directories // Perfect when your HTML references images, CSS, or JavaScript files var basePath = Path.Combine(Directory.GetCurrentDirectory(), "Templates", "Assets"); var pdfWithAssets = renderer.RenderHtmlFileAsPdf( "Templates/report-template.html", basePath //IronPDFwill resolve relative paths from here ); // Even better: Template with placeholders var templateHtml = File.ReadAllText("Templates/contract-template.html"); templateHtml = templateHtml .Replace("{{ClientName}}", "Tech Innovations Inc.") .Replace("{{ContractDate}}", DateTime.Now.ToString("MMMM dd, yyyy")) .Replace("{{ContractValue}}", "$50,000"); var contractPdf = renderer.RenderHtmlAsPdf(templateHtml); contractPdf.SaveAs("contract-final.pdf"); IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel Markdown 已成为技术文档、README 文件和内容管理系统的 标准。 IronPDF 使其易于将Markdown 内容直接转换为 PDF,在创建专业外观的文件的同时保留格式。 此功能对那些将其文档保存在 Markdown 格式的组织尤其有价值——开发人员可以用他们偏好的格式撰写文档,且系统能够自动生成 PDF 供客户或利益相关者分发。 将 Markdown 转换为 PDF 尤其适用于使用 Git 等版本控制系统的组织。 using IronPdf; var renderer = new ChromePdfRenderer(); // Convert Markdown string to PDF string markdownContent = @" # Project Documentation ## Overview This project demonstrates **PDF generation** from _Markdown_ content. ### Features - Easy conversion - Preserves formatting - Supports lists and tables | Feature | Status | |---------|--------| | Markdown Support | | | Table Rendering | | | Code Blocks | | ```csharp // Code blocks are preserved var pdf = RenderMarkdownAsPdf(markdown); \`\`\` "; // Render Markdown as PDF var pdfFromMarkdown = renderer.RenderMarkdownStringAsPdf(markdownContent); pdfFromMarkdown.SaveAs("documentation.pdf"); // Convert Markdown file to PDF var pdfFromFile = renderer.RenderMarkdownFileAsPdf("README.md"); pdfFromFile.SaveAs("readme-pdf.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); // Convert Markdown string to PDF string markdownContent = @" # Project Documentation ## Overview This project demonstrates **PDF generation** from _Markdown_ content. ### Features - Easy conversion - Preserves formatting - Supports lists and tables | Feature | Status | |---------|--------| | Markdown Support | | | Table Rendering | | | Code Blocks | | ```csharp // Code blocks are preserved var pdf = RenderMarkdownAsPdf(markdown); \`\`\` "; // Render Markdown as PDF var pdfFromMarkdown = renderer.RenderMarkdownStringAsPdf(markdownContent); pdfFromMarkdown.SaveAs("documentation.pdf"); // Convert Markdown file to PDF var pdfFromFile = renderer.RenderMarkdownFileAsPdf("README.md"); pdfFromFile.SaveAs("readme-pdf.pdf"); Imports IronPdf Private renderer = New ChromePdfRenderer() ' Convert Markdown string to PDF Private markdownContent As String = " # Project Documentation ## Overview This project demonstrates **PDF generation** from _Markdown_ content. ### Features - Easy conversion - Preserves formatting - Supports lists and tables | Feature | Status | |---------|--------| | Markdown Support | | | Table Rendering | | | Code Blocks | | ```csharp // Code blocks are preserved var pdf = RenderMarkdownAsPdf(markdown); \`\`\` " ' Render Markdown as PDF Private pdfFromMarkdown = renderer.RenderMarkdownStringAsPdf(markdownContent) pdfFromMarkdown.SaveAs("documentation.pdf") ' Convert Markdown file to PDF Dim pdfFromFile = renderer.RenderMarkdownFileAsPdf("README.md") pdfFromFile.SaveAs("readme-pdf.pdf") $vbLabelText $csharpLabel 整个文档工作流程可以实现自动化 - 开发人员更新 Markdown文件,CI/CD 管道自动生成 PDF 文件,并且利益相关者收到专业格式的文档,而无需任何手动操作。 这种无缝集成到现有工作流程中是许多开发团队选择IronPDF用于其文档需求的原因。 ### 5. 将 Word 文档(DOCX)转换为 PDF 许多企业已有的 Word 文档需要转换为 PDF 以便分发或归档。 IronPDF 提供无缝的 DOCX 到 PDF转换,保留格式、图像,甚至复杂功能如邮件合并。 此功能对组织具有变革意义——业务用户可以继续在熟悉的 Microsoft Word 中工作,而系统可以自动为外部分发生成 PDF 文件。 DOCX 到 PDF 转换 功能弥合了偏好 Word 的业务用户与需要安全、不可编辑 PDF 文件之间的差距。 此 DOCX 转换功能对于组织内的文档工作流自动化至关重要。 using IronPdf; using System.Collections.Generic; // Simple DOCX to PDF conversion var docxRenderer = new DocxToPdfRenderer(); var pdfFromDocx = docxRenderer.RenderDocxAsPdf("proposal.docx"); pdfFromDocx.SaveAs("proposal.pdf"); // Advanced: Mail merge functionality for mass document generation var recipients = new List<Dictionary<string, string>> { new() { ["Name"] = "John Smith", ["Company"] = "Tech Corp", ["Date"] = "March 15, 2024" }, new() { ["Name"] = "Jane Doe", ["Company"] = "Innovation Inc", ["Date"] = "March 15, 2024" } }; // Configure mail merge options var options = new DocxPdfRenderOptions { MailMergeDataSource = recipients, MailMergePrintAllInOnePdfDocument = false // Creates separate PDFs }; // Generate personalized PDFs from template foreach (var recipient in recipients) { var personalizedPdf = docxRenderer.RenderDocxAsPdf("letter-template.docx", options); personalizedPdf.SaveAs($"letter-{recipient["Name"].Replace(" ", "-")}.pdf"); } using IronPdf; using System.Collections.Generic; // Simple DOCX to PDF conversion var docxRenderer = new DocxToPdfRenderer(); var pdfFromDocx = docxRenderer.RenderDocxAsPdf("proposal.docx"); pdfFromDocx.SaveAs("proposal.pdf"); // Advanced: Mail merge functionality for mass document generation var recipients = new List<Dictionary<string, string>> { new() { ["Name"] = "John Smith", ["Company"] = "Tech Corp", ["Date"] = "March 15, 2024" }, new() { ["Name"] = "Jane Doe", ["Company"] = "Innovation Inc", ["Date"] = "March 15, 2024" } }; // Configure mail merge options var options = new DocxPdfRenderOptions { MailMergeDataSource = recipients, MailMergePrintAllInOnePdfDocument = false // Creates separate PDFs }; // Generate personalized PDFs from template foreach (var recipient in recipients) { var personalizedPdf = docxRenderer.RenderDocxAsPdf("letter-template.docx", options); personalizedPdf.SaveAs($"letter-{recipient["Name"].Replace(" ", "-")}.pdf"); } Imports IronPdf Imports System.Collections.Generic ' Simple DOCX to PDF conversion Private docxRenderer = New DocxToPdfRenderer() Private pdfFromDocx = docxRenderer.RenderDocxAsPdf("proposal.docx") pdfFromDocx.SaveAs("proposal.pdf") ' Advanced: Mail merge functionality for mass document generation Dim recipients = New List(Of Dictionary(Of String, String)) From { New() { ("Name") = "John Smith", ("Company") = "Tech Corp", ("Date") = "March 15, 2024" }, New() { ("Name") = "Jane Doe", ("Company") = "Innovation Inc", ("Date") = "March 15, 2024" } } ' Configure mail merge options Dim options = New DocxPdfRenderOptions With { .MailMergeDataSource = recipients, .MailMergePrintAllInOnePdfDocument = False } ' Generate personalized PDFs from template For Each recipient In recipients Dim personalizedPdf = docxRenderer.RenderDocxAsPdf("letter-template.docx", options) personalizedPdf.SaveAs($"letter-{recipient("Name").Replace(" ", "-")}.pdf") Next recipient $vbLabelText $csharpLabel 考虑一个创建改价单的销售团队——有了 IronPDF,这些改价单可以自动转换为带有水印、安全设置和数字签名的 PDF。 邮件合并功能能批量生成个性化 PDF 文件 - 非常适合在无需人工干预的情况下创建成千上万的定制信件、证书或合同。 这种集成能力是IronPDF被全球企业信赖处理其文档自动化需求的原因。 ### 6. 将图像转换为 PDF 将图像转换为 PDF 对于创建相册、扫描文档汇编或基于图像的报告至关重要。 IronPDF 支持所有主要图像格式并提供控制布局和质量的选项: ### 7. 从 ASP.NET 页面生成 PDF using IronPdf; using IronPdf.Imaging; // Install-Package IronPdf using System.IO; var renderer = new ChromePdfRenderer(); // Convert single image to PDF var imagePath = "product-photo.jpg"; var imageHtml = $@" <html> <body style='margin: 0; padding: 0;'> <img src='{imagePath}' style='width: 100%; height: auto;' /> </body> </html>"; var imagePdf = renderer.RenderHtmlAsPdf(imageHtml, Path.GetDirectoryName(imagePath)); imagePdf.SaveAs("product-catalog-page.pdf"); // Create multi-page PDF from multiple images var imageFiles = Directory.GetFiles("ProductImages", "*.jpg"); var catalogHtml = "<html><body style='margin: 0;'>"; foreach (var image in imageFiles) { catalogHtml += $@" <div style='page-break-after: always;'> <img src='{Path.GetFileName(image)}' style='width: 100%; height: auto;' /> <p style='text-align: center;'>{Path.GetFileNameWithoutExtension(image)}</p> </div>"; } catalogHtml += "</body></html>"; var catalogPdf = renderer.RenderHtmlAsPdf(catalogHtml, "ProductImages"); catalogPdf.SaveAs("product-catalog.pdf"); using IronPdf; using IronPdf.Imaging; // Install-Package IronPdf using System.IO; var renderer = new ChromePdfRenderer(); // Convert single image to PDF var imagePath = "product-photo.jpg"; var imageHtml = $@" <html> <body style='margin: 0; padding: 0;'> <img src='{imagePath}' style='width: 100%; height: auto;' /> </body> </html>"; var imagePdf = renderer.RenderHtmlAsPdf(imageHtml, Path.GetDirectoryName(imagePath)); imagePdf.SaveAs("product-catalog-page.pdf"); // Create multi-page PDF from multiple images var imageFiles = Directory.GetFiles("ProductImages", "*.jpg"); var catalogHtml = "<html><body style='margin: 0;'>"; foreach (var image in imageFiles) { catalogHtml += $@" <div style='page-break-after: always;'> <img src='{Path.GetFileName(image)}' style='width: 100%; height: auto;' /> <p style='text-align: center;'>{Path.GetFileNameWithoutExtension(image)}</p> </div>"; } catalogHtml += "</body></html>"; var catalogPdf = renderer.RenderHtmlAsPdf(catalogHtml, "ProductImages"); catalogPdf.SaveAs("product-catalog.pdf"); Imports IronPdf Imports IronPdf.Imaging ' Install-Package IronPdf Imports System.IO Private renderer = New ChromePdfRenderer() ' Convert single image to PDF Private imagePath = "product-photo.jpg" Private imageHtml = $" <html> <body style='margin: 0; padding: 0;'> <img src='{imagePath}' style='width: 100%; height: auto;' /> </body> </html>" Private imagePdf = renderer.RenderHtmlAsPdf(imageHtml, Path.GetDirectoryName(imagePath)) imagePdf.SaveAs("product-catalog-page.pdf") ' Create multi-page PDF from multiple images Dim imageFiles = Directory.GetFiles("ProductImages", "*.jpg") Dim catalogHtml = "<html><body style='margin: 0;'>" For Each image In imageFiles catalogHtml &= $" <div style='page-break-after: always;'> <img src='{Path.GetFileName(image)}' style='width: 100%; height: auto;' /> <p style='text-align: center;'>{Path.GetFileNameWithoutExtension(image)}</p> </div>" Next image catalogHtml &= "</body></html>" Dim catalogPdf = renderer.RenderHtmlAsPdf(catalogHtml, "ProductImages") catalogPdf.SaveAs("product-catalog.pdf") $vbLabelText $csharpLabel 对于 Web 应用程序,从现有视图生成 PDF 是创建 Web 内容可下载版本无缝的方法。 这种集成能力对于需要从其 Web 应用程序中创建 PDF 的组织至关重要——无论是生成对账单的客户门户、生成报表的管理仪表盘,还是创建证书的在线学习平台。IronPDF与所有 ASP.NET 技术兼容,包括 MVC、 Razor Pages 和 Blazor,使其成为已投资的 Microsoft 生态系统的组织的完美选择: ## 我如何使我的 PDF 看起来专业? // Namespace: Microsoft.AspNetCore.Mvc using Microsoft.AspNetCore.Mvc; // Namespace: IronPdf using IronPdf; // Namespace: System.Threading.Tasks using System.Threading.Tasks; // Namespace: System.IO using System.IO; // Namespace: System using System; // ASP.NET Core MVC Controller public class ReportController : Controller { private readonly ChromePdfRenderer _pdfRenderer; public ReportController() { _pdfRenderer = new ChromePdfRenderer(); } public async Task<IActionResult> DownloadReport(int reportId) { // Get your report data var reportData = await GetReportData(reportId); // Render view to HTML string var html = await RenderViewToStringAsync("Reports/MonthlyReport", reportData); // Convert HTML content to PDF var pdf = _pdfRenderer.RenderHtmlAsPdf(html); // Return as file download return File( pdf.BinaryData, "application/pdf", $"report-{reportId}-{DateTime.Now:yyyy-MM}.pdf" ); } private async Task<string> RenderViewToStringAsync(string viewName, object model) { ViewData.Model = model; using var sw = new StringWriter(); var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); var viewContext = new ViewContext( ControllerContext, viewResult.View, ViewData, TempData, sw, new HtmlHelperOptions() ); viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString(); } } // Namespace: Microsoft.AspNetCore.Mvc using Microsoft.AspNetCore.Mvc; // Namespace: IronPdf using IronPdf; // Namespace: System.Threading.Tasks using System.Threading.Tasks; // Namespace: System.IO using System.IO; // Namespace: System using System; // ASP.NET Core MVC Controller public class ReportController : Controller { private readonly ChromePdfRenderer _pdfRenderer; public ReportController() { _pdfRenderer = new ChromePdfRenderer(); } public async Task<IActionResult> DownloadReport(int reportId) { // Get your report data var reportData = await GetReportData(reportId); // Render view to HTML string var html = await RenderViewToStringAsync("Reports/MonthlyReport", reportData); // Convert HTML content to PDF var pdf = _pdfRenderer.RenderHtmlAsPdf(html); // Return as file download return File( pdf.BinaryData, "application/pdf", $"report-{reportId}-{DateTime.Now:yyyy-MM}.pdf" ); } private async Task<string> RenderViewToStringAsync(string viewName, object model) { ViewData.Model = model; using var sw = new StringWriter(); var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); var viewContext = new ViewContext( ControllerContext, viewResult.View, ViewData, TempData, sw, new HtmlHelperOptions() ); viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString(); } } ' Namespace: Microsoft.AspNetCore.Mvc Imports Microsoft.AspNetCore.Mvc ' Namespace: IronPdf Imports IronPdf ' Namespace: System.Threading.Tasks Imports System.Threading.Tasks ' Namespace: System.IO Imports System.IO ' Namespace: System Imports System ' ASP.NET Core MVC Controller Public Class ReportController Inherits Controller Private ReadOnly _pdfRenderer As ChromePdfRenderer Public Sub New() _pdfRenderer = New ChromePdfRenderer() End Sub Public Async Function DownloadReport(ByVal reportId As Integer) As Task(Of IActionResult) ' Get your report data Dim reportData = Await GetReportData(reportId) ' Render view to HTML string Dim html = Await RenderViewToStringAsync("Reports/MonthlyReport", reportData) ' Convert HTML content to PDF Dim pdf = _pdfRenderer.RenderHtmlAsPdf(html) ' Return as file download Return File(pdf.BinaryData, "application/pdf", $"report-{reportId}-{DateTime.Now:yyyy-MM}.pdf") End Function Private Async Function RenderViewToStringAsync(ByVal viewName As String, ByVal model As Object) As Task(Of String) ViewData.Model = model Dim sw = New StringWriter() Dim viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName) Dim viewContext As New ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw, New HtmlHelperOptions()) viewResult.View.Render(viewContext, sw) Return sw.GetStringBuilder().ToString() End Function End Class $vbLabelText $csharpLabel 创建 PDF 是一回事 - 使其看起来专业是您的应用程序在.NET中生成 PDF时脱颖而出的原因。 专业的 PDF 文档需要在布局、排版和品牌一致性上特别注意,才能产生正确的印象。 借助IronPDF的全面样式选项和 先进的 PDF 功能,您可以使用这个强大的 C# PDF 生成器 创建完美匹配您的公司形象的文件。 HTML 到 PDF 转换 功能可以确保您的样式化文档在作为 PDF 生成时保持其视觉吸引力。 让我们探讨那些将基本 PDF 转变为优雅的专业文件的功能,从而给客户和利益相关者留下深刻印象。 ### 页眉、页脚和页码 专业文件需要提供上下文和导航的一致的页眉和页脚。 IronPDF 提供简单的基于文本和复杂的基于 HTML 的页眉和页脚选项。 这种灵活性是当组织需要在大规模创建品牌 PDF 文件时选择IronPDF的原因。 您可以在生成的 PDF 中包含动态内容,如页码、日期和文档标题,确保每个生成的 PDF维护专业标准: 这些页眉和页脚选项使组织能够在所有生成的 PDF中保持品牌一致性。 using IronPdf; using System; var renderer = new ChromePdfRenderer(); // Simple text header and footer with page numbers renderer.RenderingOptions.TextHeader = new TextHeaderFooter { Text = "Confidential Report - {date}", DrawDividerLine = true, Font = "Arial", FontSize = 12 }; renderer.RenderingOptions.TextFooter = new TextHeaderFooter { Text = "Page {page} of {total-pages}", DrawDividerLine = true, Font = "Arial", FontSize = 10, CenterText = true }; // HTML headers for complex layouts with logos renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { Html = @" <div style='display: flex; justify-content: space-between; align-items: center; padding: 10px 40px;'> <img src='logo.png' style='height: 40px;' /> <div style='text-align: center;'> <h2 style='margin: 0; color: #333;'>Annual Report 2024</h2> <p style='margin: 0; font-size: 12px; color: #666;'>Confidential</p> </div> <div style='text-align: right; font-size: 11px; color: #666;'> Generated: {date}<br/> Department: Finance </div> </div>", Height = 80, LoadStylesAndCSSFromMainHtmlDocument = true }; // Create your PDF with professional headers/footers var html = @"<h1>Financial Overview</h1><p>Report content here...</p>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("professional-report.pdf"); using IronPdf; using System; var renderer = new ChromePdfRenderer(); // Simple text header and footer with page numbers renderer.RenderingOptions.TextHeader = new TextHeaderFooter { Text = "Confidential Report - {date}", DrawDividerLine = true, Font = "Arial", FontSize = 12 }; renderer.RenderingOptions.TextFooter = new TextHeaderFooter { Text = "Page {page} of {total-pages}", DrawDividerLine = true, Font = "Arial", FontSize = 10, CenterText = true }; // HTML headers for complex layouts with logos renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { Html = @" <div style='display: flex; justify-content: space-between; align-items: center; padding: 10px 40px;'> <img src='logo.png' style='height: 40px;' /> <div style='text-align: center;'> <h2 style='margin: 0; color: #333;'>Annual Report 2024</h2> <p style='margin: 0; font-size: 12px; color: #666;'>Confidential</p> </div> <div style='text-align: right; font-size: 11px; color: #666;'> Generated: {date}<br/> Department: Finance </div> </div>", Height = 80, LoadStylesAndCSSFromMainHtmlDocument = true }; // Create your PDF with professional headers/footers var html = @"<h1>Financial Overview</h1><p>Report content here...</p>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("professional-report.pdf"); Imports IronPdf Imports System Private renderer = New ChromePdfRenderer() ' Simple text header and footer with page numbers renderer.RenderingOptions.TextHeader = New TextHeaderFooter With { .Text = "Confidential Report - {date}", .DrawDividerLine = True, .Font = "Arial", .FontSize = 12 } renderer.RenderingOptions.TextFooter = New TextHeaderFooter With { .Text = "Page {page} of {total-pages}", .DrawDividerLine = True, .Font = "Arial", .FontSize = 10, .CenterText = True } ' HTML headers for complex layouts with logos renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With { .Html = " <div style='display: flex; justify-content: space-between; align-items: center; padding: 10px 40px;'> <img src='logo.png' style='height: 40px;' /> <div style='text-align: center;'> <h2 style='margin: 0; color: #333;'>Annual Report 2024</h2> <p style='margin: 0; font-size: 12px; color: #666;'>Confidential</p> </div> <div style='text-align: right; font-size: 11px; color: #666;'> Generated: {date}<br/> Department: Finance </div> </div>", .Height = 80, .LoadStylesAndCSSFromMainHtmlDocument = True } ' Create your PDF with professional headers/footers Dim html = "<h1>Financial Overview</h1><p>Report content here...</p>" Dim pdf = renderer.RenderHtmlAsPdf(html) pdf.SaveAs("professional-report.pdf") $vbLabelText $csharpLabel 无论是在创建财务报告还是技术文档,专业的页眉和页脚确保您的文件符合公司标准。 ### 高级页面设置和布局控制 对页面布局的控制对于创建打印正确并在所有设备上看起來专业的文档至关重要。 IronPDF 提供广泛的页面设置选项,包括自定义尺寸、方向和边距: ### 处理字体和排版 var renderer = new ChromePdfRenderer(); // Configure page setup for professional printing renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait; // Set margins in millimeters for precise control renderer.RenderingOptions.MarginTop = 25; renderer.RenderingOptions.MarginBottom = 25; renderer.RenderingOptions.MarginLeft = 20; renderer.RenderingOptions.MarginRight = 20; // Enable background colors and images (important for branding) renderer.RenderingOptions.PrintHtmlBackgrounds = true; // Use screen media type for vibrant colors renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen; // Custom page size for special documents renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297); // A4 // Enable high-quality rendering renderer.RenderingOptions.RenderQuality = 100; // 0-100 scale var renderer = new ChromePdfRenderer(); // Configure page setup for professional printing renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait; // Set margins in millimeters for precise control renderer.RenderingOptions.MarginTop = 25; renderer.RenderingOptions.MarginBottom = 25; renderer.RenderingOptions.MarginLeft = 20; renderer.RenderingOptions.MarginRight = 20; // Enable background colors and images (important for branding) renderer.RenderingOptions.PrintHtmlBackgrounds = true; // Use screen media type for vibrant colors renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen; // Custom page size for special documents renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297); // A4 // Enable high-quality rendering renderer.RenderingOptions.RenderQuality = 100; // 0-100 scale Dim renderer = New ChromePdfRenderer() ' Configure page setup for professional printing renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait ' Set margins in millimeters for precise control renderer.RenderingOptions.MarginTop = 25 renderer.RenderingOptions.MarginBottom = 25 renderer.RenderingOptions.MarginLeft = 20 renderer.RenderingOptions.MarginRight = 20 ' Enable background colors and images (important for branding) renderer.RenderingOptions.PrintHtmlBackgrounds = True ' Use screen media type for vibrant colors renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen ' Custom page size for special documents renderer.RenderingOptions.SetCustomPaperSizeinMilimeters(210, 297) ' A4 ' Enable high-quality rendering renderer.RenderingOptions.RenderQuality = 100 ' 0-100 scale $vbLabelText $csharpLabel 排版在文档专业性中起着至关重要的作用。 IronPDF 支持网络字体、自定义字体和高级排版功能: ## 真实世界示例:如何生成发票 PDF? var renderer = new ChromePdfRenderer(); // HTML with custom fonts and typography var html = @" <html> <head> <link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'> <style> @font-face { font-family: 'CustomBrand'; src: url('BrandFont.ttf') format('truetype'); } body { font-family: 'Roboto', Arial, sans-serif; font-size: 11pt; line-height: 1.6; color: #333; } h1 { font-family: 'CustomBrand', Georgia, serif; font-size: 28pt; color: #0066cc; letter-spacing: -0.5px; } .quote { font-style: italic; font-size: 14pt; color: #666; border-left: 4px solid #0066cc; padding-left: 20px; margin: 20px 0; } </style> </head> <body> <h1>Professional Document</h1> <p>This document demonstrates professional typography.</p> <div class='quote'> "Excellence in typography enhances readability and professionalism." </div> </body> </html>"; var pdf = renderer.RenderHtmlAsPdf(html, "Assets/Fonts"); pdf.SaveAs("typography-demo.pdf"); var renderer = new ChromePdfRenderer(); // HTML with custom fonts and typography var html = @" <html> <head> <link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'> <style> @font-face { font-family: 'CustomBrand'; src: url('BrandFont.ttf') format('truetype'); } body { font-family: 'Roboto', Arial, sans-serif; font-size: 11pt; line-height: 1.6; color: #333; } h1 { font-family: 'CustomBrand', Georgia, serif; font-size: 28pt; color: #0066cc; letter-spacing: -0.5px; } .quote { font-style: italic; font-size: 14pt; color: #666; border-left: 4px solid #0066cc; padding-left: 20px; margin: 20px 0; } </style> </head> <body> <h1>Professional Document</h1> <p>This document demonstrates professional typography.</p> <div class='quote'> "Excellence in typography enhances readability and professionalism." </div> </body> </html>"; var pdf = renderer.RenderHtmlAsPdf(html, "Assets/Fonts"); pdf.SaveAs("typography-demo.pdf"); Dim renderer = New ChromePdfRenderer() ' HTML with custom fonts and typography Dim html = " <html> <head> <link href='https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap' rel='stylesheet'> <style> @font-face { font-family: 'CustomBrand'; src: url('BrandFont.ttf') format('truetype'); } body { font-family: 'Roboto', Arial, sans-serif; font-size: 11pt; line-height: 1.6; color: #333; } h1 { font-family: 'CustomBrand', Georgia, serif; font-size: 28pt; color: #0066cc; letter-spacing: -0.5px; } .quote { font-style: italic; font-size: 14pt; color: #666; border-left: 4px solid #0066cc; padding-left: 20px; margin: 20px 0; } </style> </head> <body> <h1>Professional Document</h1> <p>This document demonstrates professional typography.</p> <div class='quote'> "Excellence in typography enhances readability [and] professionalism." </div> </body> </html>" Dim pdf = renderer.RenderHtmlAsPdf(html, "Assets/Fonts") pdf.SaveAs("typography-demo.pdf") $vbLabelText $csharpLabel 让我们创建一个完整的、生产就绪的发票生成器,展示在真实世界应用中创建 PDF 文件的最佳实践。 这个示例显示了数千家公司为什么选择IronPDF作为生成发票的C# PDF 生成器——它结合了数据绑定、专业样式和良好文档结构,以及强大且易于维护的方式。 类似实现被电子商务平台用于每月生成数百万发票,展示了在 .NET 中程序化PDF 生成的可扩展性。 您可以将此代码自定义为您自己的PDF 创建任务: ##IronPDF提供那些高级 PDF 功能? using IronPdf; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; public class InvoiceGenerator { private readonly ChromePdfRenderer _renderer; public InvoiceGenerator() { _renderer = new ChromePdfRenderer(); ConfigureRenderer(); } private void ConfigureRenderer() { // Professional page setup _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; _renderer.RenderingOptions.MarginTop = 25; _renderer.RenderingOptions.MarginBottom = 25; _renderer.RenderingOptions.MarginLeft = 25; _renderer.RenderingOptions.MarginRight = 25; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; // Add footer with page numbers _renderer.RenderingOptions.TextFooter = new TextHeaderFooter { Text = "Page {page} of {total-pages} | Invoice generated on {date}", FontSize = 9, Font = "Arial", CenterText = true }; } public void CreateInvoice(Invoice invoice) { var html = GenerateInvoiceHtml(invoice); var pdf = _renderer.RenderHtmlAsPdf(html); // Add metadata to the final document pdf.MetaData.Title = $"Invoice {invoice.Number}"; pdf.MetaData.Author = "Your Company Name"; pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}"; pdf.MetaData.Keywords = "invoice, billing, payment"; pdf.MetaData.CreationDate = DateTime.Now; // Save the PDF document var fileName = $"Invoice-{invoice.Number}.pdf"; pdf.SaveAs(fileName); Console.WriteLine($"PDF generated successfully: {fileName}"); } private string GenerateInvoiceHtml(Invoice invoice) { var itemsHtml = string.Join("", invoice.Items.Select(item => $@" <tr> <td style='padding: 12px; border-bottom: 1px solid #eee;'>{item.Description}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: center;'>{item.Quantity}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.UnitPrice:F2}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.Total:F2}</td> </tr>")); return $@" <html> <head> <style> * {{ box-sizing: border-box; }} body {{ font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; }} .invoice-container {{ max-width: 800px; margin: 0 auto; padding: 40px; }} .invoice-header {{ display: flex; justify-content: space-between; margin-bottom: 40px; padding-bottom: 20px; border-bottom: 3px solid #0066cc; }} .company-details {{ flex: 1; }} .company-details h1 {{ color: #0066cc; margin: 0 0 10px 0; font-size: 28px; }} .invoice-details {{ flex: 1; text-align: right; }} .invoice-details h2 {{ margin: 0 0 10px 0; color: #666; font-size: 24px; }} .invoice-number {{ font-size: 18px; color: #0066cc; font-weight: bold; }} .billing-section {{ display: flex; justify-content: space-between; margin-bottom: 40px; }} .billing-box {{ flex: 1; padding: 20px; background: #f8f9fa; border-radius: 8px; margin-right: 20px; }} .billing-box:last-child {{ margin-right: 0; }} .billing-box h3 {{ margin: 0 0 15px 0; color: #0066cc; font-size: 16px; text-transform: uppercase; letter-spacing: 1px; }} .items-table {{ width: 100%; border-collapse: collapse; margin-bottom: 40px; }} .items-table th {{ background: #0066cc; color: white; padding: 12px; text-align: left; font-weight: 600; }} .items-table th:last-child {{ text-align: right; }} .totals-section {{ display: flex; justify-content: flex-end; margin-bottom: 40px; }} .totals-box {{ width: 300px; }} .total-row {{ display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #eee; }} .total-row.final {{ border-bottom: none; border-top: 2px solid #0066cc; margin-top: 10px; padding-top: 15px; font-size: 20px; font-weight: bold; color: #0066cc; }} .payment-terms {{ background: #f8f9fa; padding: 20px; border-radius: 8px; margin-bottom: 30px; }} .payment-terms h3 {{ margin: 0 0 10px 0; color: #0066cc; }} .footer-note {{ text-align: center; color: #666; font-size: 14px; margin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; }} </style> </head> <body> <div class='invoice-container'> <div class='invoice-header'> <div class='company-details'> <h1>{invoice.CompanyName}</h1> <p>{invoice.CompanyAddress}<br> {invoice.CompanyCity}, {invoice.CompanyState} {invoice.CompanyZip}<br> Phone: {invoice.CompanyPhone}<br> Email: {invoice.CompanyEmail}</p> </div> <div class='invoice-details'> <h2>INVOICE</h2> <p class='invoice-number'>#{invoice.Number}</p> <p><strong>Date:</strong> {invoice.Date:MMMM dd, yyyy}<br> <strong>Due Date:</strong> {invoice.DueDate:MMMM dd, yyyy}</p> </div> </div> <div class='billing-section'> <div class='billing-box'> <h3>Bill To</h3> <p><strong>{invoice.CustomerName}</strong><br> {invoice.CustomerAddress}<br> {invoice.CustomerCity}, {invoice.CustomerState} {invoice.CustomerZip}<br> {invoice.CustomerEmail}</p> </div> <div class='billing-box'> <h3>Payment Information</h3> <p><strong>Payment Terms:</strong> {invoice.PaymentTerms}<br> <strong>Invoice Status:</strong> <span style='color: #ff6b6b;'>Unpaid</span><br> <strong>Amount Due:</strong> ${invoice.Total:F2}</p> </div> </div> <table class='items-table'> <thead> <tr> <th>Description</th> <th style='text-align: center;'>Quantity</th> <th style='text-align: right;'>Unit Price</th> <th style='text-align: right;'>Total</th> </tr> </thead> <tbody> {itemsHtml} </tbody> </table> <div class='totals-section'> <div class='totals-box'> <div class='total-row'> <span>Subtotal:</span> <span>${invoice.Subtotal:F2}</span> </div> <div class='total-row'> <span>Tax ({invoice.TaxRate:F0}%):</span> <span>${invoice.Tax:F2}</span> </div> <div class='total-row final'> <span>Total Due:</span> <span>${invoice.Total:F2}</span> </div> </div> </div> <div class='payment-terms'> <h3>Payment Terms & Conditions</h3> <p>Payment is due within {invoice.PaymentTerms}. Late payments are subject to a 1.5% monthly service charge. Please make checks payable to {invoice.CompanyName} or pay online at {invoice.CompanyWebsite}.</p> </div> <div class='footer-note'> <p>Thank you for your business! This invoice was generated automatically using our C# PDF generation system.</p> <p>Questions? Contact us at {invoice.CompanyEmail} or {invoice.CompanyPhone}</p> </div> </div> </body> </html>"; } } // Invoice model classes public class Invoice { public string Number { get; set; } public DateTime Date { get; set; } public DateTime DueDate { get; set; } public string CompanyName { get; set; } public string CompanyAddress { get; set; } public string CompanyCity { get; set; } public string CompanyState { get; set; } public string CompanyZip { get; set; } public string CompanyPhone { get; set; } public string CompanyEmail { get; set; } public string CompanyWebsite { get; set; } public string CustomerName { get; set; } public string CustomerAddress { get; set; } public string CustomerCity { get; set; } public string CustomerState { get; set; } public string CustomerZip { get; set; } public string CustomerEmail { get; set; } public string PaymentTerms { get; set; } public List<InvoiceItem> Items { get; set; } public decimal Subtotal => Items.Sum(i => i.Total); public decimal TaxRate { get; set; } public decimal Tax => Subtotal * (TaxRate / 100); public decimal Total => Subtotal + Tax; } public class InvoiceItem { public string Description { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; } public decimal Total => Quantity * UnitPrice; } // Usage example var generator = new InvoiceGenerator(); var invoice = new Invoice { Number = "INV-2024-001", Date = DateTime.Now, DueDate = DateTime.Now.AddDays(30), CompanyName = "Your Company Name", CompanyAddress = "123 Business Street", CompanyCity = "New York", CompanyState = "NY", CompanyZip = "10001", CompanyPhone = "(555) 123-4567", CompanyEmail = "billing@yourcompany.com", CompanyWebsite = "www.yourcompany.com", CustomerName = "Acme Corporation", CustomerAddress = "456 Client Avenue", CustomerCity = "Los Angeles", CustomerState = "CA", CustomerZip = "90001", CustomerEmail = "accounts@acmecorp.com", PaymentTerms = "Net 30", TaxRate = 8.5m, Items = new List<InvoiceItem> { new() { Description = "Professional Services - March 2024", Quantity = 40, UnitPrice = 125.00m }, new() { Description = "Software License (Annual)", Quantity = 1, UnitPrice = 2400.00m }, new() { Description = "Technical Support", Quantity = 10, UnitPrice = 150.00m } } }; generator.CreateInvoice(invoice); using IronPdf; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; public class InvoiceGenerator { private readonly ChromePdfRenderer _renderer; public InvoiceGenerator() { _renderer = new ChromePdfRenderer(); ConfigureRenderer(); } private void ConfigureRenderer() { // Professional page setup _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; _renderer.RenderingOptions.MarginTop = 25; _renderer.RenderingOptions.MarginBottom = 25; _renderer.RenderingOptions.MarginLeft = 25; _renderer.RenderingOptions.MarginRight = 25; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; // Add footer with page numbers _renderer.RenderingOptions.TextFooter = new TextHeaderFooter { Text = "Page {page} of {total-pages} | Invoice generated on {date}", FontSize = 9, Font = "Arial", CenterText = true }; } public void CreateInvoice(Invoice invoice) { var html = GenerateInvoiceHtml(invoice); var pdf = _renderer.RenderHtmlAsPdf(html); // Add metadata to the final document pdf.MetaData.Title = $"Invoice {invoice.Number}"; pdf.MetaData.Author = "Your Company Name"; pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}"; pdf.MetaData.Keywords = "invoice, billing, payment"; pdf.MetaData.CreationDate = DateTime.Now; // Save the PDF document var fileName = $"Invoice-{invoice.Number}.pdf"; pdf.SaveAs(fileName); Console.WriteLine($"PDF generated successfully: {fileName}"); } private string GenerateInvoiceHtml(Invoice invoice) { var itemsHtml = string.Join("", invoice.Items.Select(item => $@" <tr> <td style='padding: 12px; border-bottom: 1px solid #eee;'>{item.Description}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: center;'>{item.Quantity}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.UnitPrice:F2}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.Total:F2}</td> </tr>")); return $@" <html> <head> <style> * {{ box-sizing: border-box; }} body {{ font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; }} .invoice-container {{ max-width: 800px; margin: 0 auto; padding: 40px; }} .invoice-header {{ display: flex; justify-content: space-between; margin-bottom: 40px; padding-bottom: 20px; border-bottom: 3px solid #0066cc; }} .company-details {{ flex: 1; }} .company-details h1 {{ color: #0066cc; margin: 0 0 10px 0; font-size: 28px; }} .invoice-details {{ flex: 1; text-align: right; }} .invoice-details h2 {{ margin: 0 0 10px 0; color: #666; font-size: 24px; }} .invoice-number {{ font-size: 18px; color: #0066cc; font-weight: bold; }} .billing-section {{ display: flex; justify-content: space-between; margin-bottom: 40px; }} .billing-box {{ flex: 1; padding: 20px; background: #f8f9fa; border-radius: 8px; margin-right: 20px; }} .billing-box:last-child {{ margin-right: 0; }} .billing-box h3 {{ margin: 0 0 15px 0; color: #0066cc; font-size: 16px; text-transform: uppercase; letter-spacing: 1px; }} .items-table {{ width: 100%; border-collapse: collapse; margin-bottom: 40px; }} .items-table th {{ background: #0066cc; color: white; padding: 12px; text-align: left; font-weight: 600; }} .items-table th:last-child {{ text-align: right; }} .totals-section {{ display: flex; justify-content: flex-end; margin-bottom: 40px; }} .totals-box {{ width: 300px; }} .total-row {{ display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #eee; }} .total-row.final {{ border-bottom: none; border-top: 2px solid #0066cc; margin-top: 10px; padding-top: 15px; font-size: 20px; font-weight: bold; color: #0066cc; }} .payment-terms {{ background: #f8f9fa; padding: 20px; border-radius: 8px; margin-bottom: 30px; }} .payment-terms h3 {{ margin: 0 0 10px 0; color: #0066cc; }} .footer-note {{ text-align: center; color: #666; font-size: 14px; margin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; }} </style> </head> <body> <div class='invoice-container'> <div class='invoice-header'> <div class='company-details'> <h1>{invoice.CompanyName}</h1> <p>{invoice.CompanyAddress}<br> {invoice.CompanyCity}, {invoice.CompanyState} {invoice.CompanyZip}<br> Phone: {invoice.CompanyPhone}<br> Email: {invoice.CompanyEmail}</p> </div> <div class='invoice-details'> <h2>INVOICE</h2> <p class='invoice-number'>#{invoice.Number}</p> <p><strong>Date:</strong> {invoice.Date:MMMM dd, yyyy}<br> <strong>Due Date:</strong> {invoice.DueDate:MMMM dd, yyyy}</p> </div> </div> <div class='billing-section'> <div class='billing-box'> <h3>Bill To</h3> <p><strong>{invoice.CustomerName}</strong><br> {invoice.CustomerAddress}<br> {invoice.CustomerCity}, {invoice.CustomerState} {invoice.CustomerZip}<br> {invoice.CustomerEmail}</p> </div> <div class='billing-box'> <h3>Payment Information</h3> <p><strong>Payment Terms:</strong> {invoice.PaymentTerms}<br> <strong>Invoice Status:</strong> <span style='color: #ff6b6b;'>Unpaid</span><br> <strong>Amount Due:</strong> ${invoice.Total:F2}</p> </div> </div> <table class='items-table'> <thead> <tr> <th>Description</th> <th style='text-align: center;'>Quantity</th> <th style='text-align: right;'>Unit Price</th> <th style='text-align: right;'>Total</th> </tr> </thead> <tbody> {itemsHtml} </tbody> </table> <div class='totals-section'> <div class='totals-box'> <div class='total-row'> <span>Subtotal:</span> <span>${invoice.Subtotal:F2}</span> </div> <div class='total-row'> <span>Tax ({invoice.TaxRate:F0}%):</span> <span>${invoice.Tax:F2}</span> </div> <div class='total-row final'> <span>Total Due:</span> <span>${invoice.Total:F2}</span> </div> </div> </div> <div class='payment-terms'> <h3>Payment Terms & Conditions</h3> <p>Payment is due within {invoice.PaymentTerms}. Late payments are subject to a 1.5% monthly service charge. Please make checks payable to {invoice.CompanyName} or pay online at {invoice.CompanyWebsite}.</p> </div> <div class='footer-note'> <p>Thank you for your business! This invoice was generated automatically using our C# PDF generation system.</p> <p>Questions? Contact us at {invoice.CompanyEmail} or {invoice.CompanyPhone}</p> </div> </div> </body> </html>"; } } // Invoice model classes public class Invoice { public string Number { get; set; } public DateTime Date { get; set; } public DateTime DueDate { get; set; } public string CompanyName { get; set; } public string CompanyAddress { get; set; } public string CompanyCity { get; set; } public string CompanyState { get; set; } public string CompanyZip { get; set; } public string CompanyPhone { get; set; } public string CompanyEmail { get; set; } public string CompanyWebsite { get; set; } public string CustomerName { get; set; } public string CustomerAddress { get; set; } public string CustomerCity { get; set; } public string CustomerState { get; set; } public string CustomerZip { get; set; } public string CustomerEmail { get; set; } public string PaymentTerms { get; set; } public List<InvoiceItem> Items { get; set; } public decimal Subtotal => Items.Sum(i => i.Total); public decimal TaxRate { get; set; } public decimal Tax => Subtotal * (TaxRate / 100); public decimal Total => Subtotal + Tax; } public class InvoiceItem { public string Description { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; } public decimal Total => Quantity * UnitPrice; } // Usage example var generator = new InvoiceGenerator(); var invoice = new Invoice { Number = "INV-2024-001", Date = DateTime.Now, DueDate = DateTime.Now.AddDays(30), CompanyName = "Your Company Name", CompanyAddress = "123 Business Street", CompanyCity = "New York", CompanyState = "NY", CompanyZip = "10001", CompanyPhone = "(555) 123-4567", CompanyEmail = "billing@yourcompany.com", CompanyWebsite = "www.yourcompany.com", CustomerName = "Acme Corporation", CustomerAddress = "456 Client Avenue", CustomerCity = "Los Angeles", CustomerState = "CA", CustomerZip = "90001", CustomerEmail = "accounts@acmecorp.com", PaymentTerms = "Net 30", TaxRate = 8.5m, Items = new List<InvoiceItem> { new() { Description = "Professional Services - March 2024", Quantity = 40, UnitPrice = 125.00m }, new() { Description = "Software License (Annual)", Quantity = 1, UnitPrice = 2400.00m }, new() { Description = "Technical Support", Quantity = 10, UnitPrice = 150.00m } } }; generator.CreateInvoice(invoice); Imports IronPdf Imports System Imports System.Collections.Generic Imports System.Globalization Imports System.Linq Public Class InvoiceGenerator Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer() ConfigureRenderer() End Sub Private Sub ConfigureRenderer() ' Professional page setup _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 _renderer.RenderingOptions.MarginTop = 25 _renderer.RenderingOptions.MarginBottom = 25 _renderer.RenderingOptions.MarginLeft = 25 _renderer.RenderingOptions.MarginRight = 25 _renderer.RenderingOptions.PrintHtmlBackgrounds = True ' Add footer with page numbers _renderer.RenderingOptions.TextFooter = New TextHeaderFooter With { .Text = "Page {page} of {total-pages} | Invoice generated on {date}", .FontSize = 9, .Font = "Arial", .CenterText = True } End Sub Public Sub CreateInvoice(ByVal invoice As Invoice) Dim html = GenerateInvoiceHtml(invoice) Dim pdf = _renderer.RenderHtmlAsPdf(html) ' Add metadata to the final document pdf.MetaData.Title = $"Invoice {invoice.Number}" pdf.MetaData.Author = "Your Company Name" pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}" pdf.MetaData.Keywords = "invoice, billing, payment" pdf.MetaData.CreationDate = DateTime.Now ' Save the PDF document Dim fileName = $"Invoice-{invoice.Number}.pdf" pdf.SaveAs(fileName) Console.WriteLine($"PDF generated successfully: {fileName}") End Sub Private Function GenerateInvoiceHtml(ByVal invoice As Invoice) As String Dim itemsHtml = String.Join("", invoice.Items.Select(Function(item) $" <tr> <td style='padding: 12px; border-bottom: 1px solid #eee;'>{item.Description}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: center;'>{item.Quantity}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.UnitPrice:F2}</td> <td style='padding: 12px; border-bottom: 1px solid #eee; text-align: right;'>${item.Total:F2}</td> </tr>")) Return $" <html> <head> <style> * {{ box-sizing: border-box; }} body {{ font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; }} .invoice-container {{ max-width: 800px; margin: 0 auto; padding: 40px; }} .invoice-header {{ display: flex; justify-content: space-between; margin-bottom: 40px; padding-bottom: 20px; border-bottom: 3px solid #0066cc; }} .company-details {{ flex: 1; }} .company-details h1 {{ color: #0066cc; margin: 0 0 10px 0; font-size: 28px; }} .invoice-details {{ flex: 1; text-align: right; }} .invoice-details h2 {{ margin: 0 0 10px 0; color: #666; font-size: 24px; }} .invoice-number {{ font-size: 18px; color: #0066cc; font-weight: bold; }} .billing-section {{ display: flex; justify-content: space-between; margin-bottom: 40px; }} .billing-box {{ flex: 1; padding: 20px; background: #f8f9fa; border-radius: 8px; margin-right: 20px; }} .billing-box:last-child {{ margin-right: 0; }} .billing-box h3 {{ margin: 0 0 15px 0; color: #0066cc; font-size: 16px; text-transform: uppercase; letter-spacing: 1px; }} .items-table {{ width: 100%; border-collapse: collapse; margin-bottom: 40px; }} .items-table th {{ background: #0066cc; color: white; padding: 12px; text-align: left; font-weight: 600; }} .items-table th:last-child {{ text-align: right; }} .totals-section {{ display: flex; justify-content: flex-end; margin-bottom: 40px; }} .totals-box {{ width: 300px; }} .total-row {{ display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #eee; }} .total-row.final {{ border-bottom: none; border-top: 2px solid #0066cc; margin-top: 10px; padding-top: 15px; font-size: 20px; font-weight: bold; color: #0066cc; }} .payment-terms {{ background: #f8f9fa; padding: 20px; border-radius: 8px; margin-bottom: 30px; }} .payment-terms h3 {{ margin: 0 0 10px 0; color: #0066cc; }} .footer-note {{ text-align: center; color: #666; font-size: 14px; margin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; }} </style> </head> <body> <div class='invoice-container'> <div class='invoice-header'> <div class='company-details'> <h1>{invoice.CompanyName}</h1> <p>{invoice.CompanyAddress}<br> {invoice.CompanyCity}, {invoice.CompanyState} {invoice.CompanyZip}<br> Phone: {invoice.CompanyPhone}<br> Email: {invoice.CompanyEmail}</p> </div> <div class='invoice-details'> <h2>INVOICE</h2> <p class='invoice-number'>#{invoice.Number}</p> <p><strong>Date:</strong> {invoice.Date:=MMMM dd, yyyy}<br> <strong>Due Date:</strong> {invoice.DueDate:=MMMM dd, yyyy}</p> </div> </div> <div class='billing-section'> <div class='billing-box'> <h3>Bill To</h3> <p><strong>{invoice.CustomerName}</strong><br> {invoice.CustomerAddress}<br> {invoice.CustomerCity}, {invoice.CustomerState} {invoice.CustomerZip}<br> {invoice.CustomerEmail}</p> </div> <div class='billing-box'> <h3>Payment Information</h3> <p><strong>Payment Terms:</strong> {invoice.PaymentTerms}<br> <strong>Invoice Status:</strong> <span style='color: #ff6b6b;'>Unpaid</span><br> <strong>Amount Due:</strong> ${invoice.Total:F2}</p> </div> </div> <table class='items-table'> <thead> <tr> <th>Description</th> <th style='text-align: center;'>Quantity</th> <th style='text-align: right;'>Unit Price</th> <th style='text-align: right;'>Total</th> </tr> </thead> <tbody> {itemsHtml} </tbody> </table> <div class='totals-section'> <div class='totals-box'> <div class='total-row'> <span>Subtotal:</span> <span>${invoice.Subtotal:F2}</span> </div> <div class='total-row'> <span>Tax ({invoice.TaxRate:F0}%):</span> <span>${invoice.Tax:F2}</span> </div> <div class='total-row final'> <span>Total Due:</span> <span>${invoice.Total:F2}</span> </div> </div> </div> <div class='payment-terms'> <h3>Payment Terms & Conditions</h3> <p>Payment is due within {invoice.PaymentTerms}. Late payments are subject to a 1.5% monthly service charge. Please make checks payable to {invoice.CompanyName} or pay online at {invoice.CompanyWebsite}.</p> </div> <div class='footer-note'> <p>Thank you for your business! This invoice was generated automatically using our C# PDF generation system.</p> <p>Questions? Contact us at {invoice.CompanyEmail} or {invoice.CompanyPhone}</p> </div> </div> </body> </html>" End Function End Class ' Invoice model classes Public Class Invoice Public Property Number() As String Public Property [Date]() As DateTime Public Property DueDate() As DateTime Public Property CompanyName() As String Public Property CompanyAddress() As String Public Property CompanyCity() As String Public Property CompanyState() As String Public Property CompanyZip() As String Public Property CompanyPhone() As String Public Property CompanyEmail() As String Public Property CompanyWebsite() As String Public Property CustomerName() As String Public Property CustomerAddress() As String Public Property CustomerCity() As String Public Property CustomerState() As String Public Property CustomerZip() As String Public Property CustomerEmail() As String Public Property PaymentTerms() As String Public Property Items() As List(Of InvoiceItem) Public ReadOnly Property Subtotal() As Decimal Get Return Items.Sum(Function(i) i.Total) End Get End Property Public Property TaxRate() As Decimal Public ReadOnly Property Tax() As Decimal Get Return Subtotal * (TaxRate / 100) End Get End Property Public ReadOnly Property Total() As Decimal Get Return Subtotal + Tax End Get End Property End Class Public Class InvoiceItem Public Property Description() As String Public Property Quantity() As Integer Public Property UnitPrice() As Decimal Public ReadOnly Property Total() As Decimal Get Return Quantity * UnitPrice End Get End Property End Class ' Usage example Private generator = New InvoiceGenerator() Private invoice = New Invoice With { .Number = "INV-2024-001", .Date = DateTime.Now, .DueDate = DateTime.Now.AddDays(30), .CompanyName = "Your Company Name", .CompanyAddress = "123 Business Street", .CompanyCity = "New York", .CompanyState = "NY", .CompanyZip = "10001", .CompanyPhone = "(555) 123-4567", .CompanyEmail = "billing@yourcompany.com", .CompanyWebsite = "www.yourcompany.com", .CustomerName = "Acme Corporation", .CustomerAddress = "456 Client Avenue", .CustomerCity = "Los Angeles", .CustomerState = "CA", .CustomerZip = "90001", .CustomerEmail = "accounts@acmecorp.com", .PaymentTerms = "Net 30", .TaxRate = 8.5D, .Items = New List(Of InvoiceItem) From { New() { Description = "Professional Services - March 2024", Quantity = 40, UnitPrice = 125.00D }, New() { Description = "Software License (Annual)", Quantity = 1, UnitPrice = 2400.00D }, New() { Description = "Technical Support", Quantity = 10, UnitPrice = 150.00D } } } generator.CreateInvoice(invoice) $vbLabelText $csharpLabel IronPDF 超越了基本的 在 C# 中创建 PDF,提供了复杂的文档工作流和企业级功能所需的成熟功能。 这些高级功能允许您创建交互式表单、保护敏感文件,以及在您在 .NET 构建 PDF时精确操控现有 PDF。 这些功能是全球数千开发人员信赖IronPDF满足其任务关键型 PDF 生成 需求的原因。 了解这些功能有助于您构建满足最苛刻要求的全面 PDF 解决方案 - 从 创建可填写的表单 到在您的 C# PDF 创建项目中实施企业级安全性。 ### 生成交互式 PDF 表单 以编程方式创建可填写 PDF 表单为实现数据收集和文档工作流自动化打开了可能性。 IronPDF 可以将 HTML 表单转化为交互式 PDF 表单,用户可以在任何 PDF 阅读器中填写: ### 保护您的生成的 PDF // Namespace: IronPdf using IronPdf; // Namespace: System using System; var renderer = new ChromePdfRenderer(); // Enable form creation from HTML renderer.RenderingOptions.CreatePdfFormsFromHtml = true; // Create an interactive form with various input types var formHtml = @" <html> <head> <style> body { font-family: Arial, sans-serif; padding: 40px; } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 5px; font-weight: bold; } input[type='text'], input[type='email'], select, textarea { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; } .checkbox-group { margin: 10px 0; } .submit-section { margin-top: 30px; padding-top: 20px; border-top: 2px solid #0066cc; } </style> </head> <body> <h1>Application Form</h1> <form> <div class='form-group'> <label for='fullName'>Full Name:</label> <input type='text' id='fullName' name='fullName' required /> </div> <div class='form-group'> <label for='email'>Email Address:</label> <input type='email' id='email' name='email' required /> </div> <div class='form-group'> <label for='department'>Department:</label> <select id='department' name='department'> <option value=''>Select Department</option> <option value='sales'>Sales</option> <option value='marketing'>Marketing</option> <option value='engineering'>Engineering</option> <option value='hr'>Human Resources</option> </select> </div> <div class='form-group'> <label>Interests:</label> <div class='checkbox-group'> <label><input type='checkbox' name='interests' value='training' /> Professional Training</label> <label><input type='checkbox' name='interests' value='conferences' /> Industry Conferences</label> <label><input type='checkbox' name='interests' value='certification' /> Certification Programs</label> </div> </div> <div class='form-group'> <label for='comments'>Additional Comments:</label> <textarea id='comments' name='comments' rows='4'></textarea> </div> <div class='submit-section'> <p><em>Please save this form and email to hr@company.com</em></p> </div> </form> </body> </html>"; // Create the PDF with form fields var formPdf = renderer.RenderHtmlAsPdf(formHtml); // Optionally pre-fill form fields programmatically formPdf.Form.FindFormField("fullName").Value = "John Smith"; formPdf.Form.FindFormField("email").Value = "john.smith@example.com"; formPdf.Form.FindFormField("department").Value = "engineering"; // Save the interactive form formPdf.SaveAs("application-form.pdf"); // You can also read and process submitted forms var submittedPdf = PdfDocument.FromFile("submitted-form.pdf"); var name = submittedPdf.Form.FindFormField("fullName").Value; var email = submittedPdf.Form.FindFormField("email").Value; Console.WriteLine($"Form submitted by: {name} ({email})"); // Namespace: IronPdf using IronPdf; // Namespace: System using System; var renderer = new ChromePdfRenderer(); // Enable form creation from HTML renderer.RenderingOptions.CreatePdfFormsFromHtml = true; // Create an interactive form with various input types var formHtml = @" <html> <head> <style> body { font-family: Arial, sans-serif; padding: 40px; } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 5px; font-weight: bold; } input[type='text'], input[type='email'], select, textarea { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; } .checkbox-group { margin: 10px 0; } .submit-section { margin-top: 30px; padding-top: 20px; border-top: 2px solid #0066cc; } </style> </head> <body> <h1>Application Form</h1> <form> <div class='form-group'> <label for='fullName'>Full Name:</label> <input type='text' id='fullName' name='fullName' required /> </div> <div class='form-group'> <label for='email'>Email Address:</label> <input type='email' id='email' name='email' required /> </div> <div class='form-group'> <label for='department'>Department:</label> <select id='department' name='department'> <option value=''>Select Department</option> <option value='sales'>Sales</option> <option value='marketing'>Marketing</option> <option value='engineering'>Engineering</option> <option value='hr'>Human Resources</option> </select> </div> <div class='form-group'> <label>Interests:</label> <div class='checkbox-group'> <label><input type='checkbox' name='interests' value='training' /> Professional Training</label> <label><input type='checkbox' name='interests' value='conferences' /> Industry Conferences</label> <label><input type='checkbox' name='interests' value='certification' /> Certification Programs</label> </div> </div> <div class='form-group'> <label for='comments'>Additional Comments:</label> <textarea id='comments' name='comments' rows='4'></textarea> </div> <div class='submit-section'> <p><em>Please save this form and email to hr@company.com</em></p> </div> </form> </body> </html>"; // Create the PDF with form fields var formPdf = renderer.RenderHtmlAsPdf(formHtml); // Optionally pre-fill form fields programmatically formPdf.Form.FindFormField("fullName").Value = "John Smith"; formPdf.Form.FindFormField("email").Value = "john.smith@example.com"; formPdf.Form.FindFormField("department").Value = "engineering"; // Save the interactive form formPdf.SaveAs("application-form.pdf"); // You can also read and process submitted forms var submittedPdf = PdfDocument.FromFile("submitted-form.pdf"); var name = submittedPdf.Form.FindFormField("fullName").Value; var email = submittedPdf.Form.FindFormField("email").Value; Console.WriteLine($"Form submitted by: {name} ({email})"); ' Namespace: IronPdf Imports IronPdf ' Namespace: System Imports System Private renderer = New ChromePdfRenderer() ' Enable form creation from HTML renderer.RenderingOptions.CreatePdfFormsFromHtml = True ' Create an interactive form with various input types Dim formHtml = " <html> <head> <style> body { font-family: Arial, sans-serif; padding: 40px; } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 5px; font-weight: bold; } input[type='text'], input[type='email'], select, textarea { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; } .checkbox-group { margin: 10px 0; } .submit-section { margin-top: 30px; padding-top: 20px; border-top: 2px solid #0066cc; } </style> </head> <body> <h1>Application Form</h1> <form> <div class='form-group'> <label for='fullName'>Full Name:</label> <input type='text' id='fullName' name='fullName' required /> </div> <div class='form-group'> <label for='email'>Email Address:</label> <input type='email' id='email' name='email' required /> </div> <div class='form-group'> <label for='department'>Department:</label> <select id='department' name='department'> <option value=''>Select Department</option> <option value='sales'>Sales</option> <option value='marketing'>Marketing</option> <option value='engineering'>Engineering</option> <option value='hr'>Human Resources</option> </select> </div> <div class='form-group'> <label>Interests:</label> <div class='checkbox-group'> <label><input type='checkbox' name='interests' value='training' /> Professional Training</label> <label><input type='checkbox' name='interests' value='conferences' /> Industry Conferences</label> <label><input type='checkbox' name='interests' value='certification' /> Certification Programs</label> </div> </div> <div class='form-group'> <label for='comments'>Additional Comments:</label> <textarea id='comments' name='comments' rows='4'></textarea> </div> <div class='submit-section'> <p><em>Please save this form and email to hr@company.com</em></p> </div> </form> </body> </html>" ' Create the PDF with form fields Dim formPdf = renderer.RenderHtmlAsPdf(formHtml) ' Optionally pre-fill form fields programmatically formPdf.Form.FindFormField("fullName").Value = "John Smith" formPdf.Form.FindFormField("email").Value = "john.smith@example.com" formPdf.Form.FindFormField("department").Value = "engineering" ' Save the interactive form formPdf.SaveAs("application-form.pdf") ' You can also read and process submitted forms Dim submittedPdf = PdfDocument.FromFile("submitted-form.pdf") Dim name = submittedPdf.Form.FindFormField("fullName").Value Dim email = submittedPdf.Form.FindFormField("email").Value Console.WriteLine($"Form submitted by: {name} ({email})") $vbLabelText $csharpLabel 在处理敏感文件时安全性至关重要。 IronPDF 提供全面的安全功能以保护您的 PDF 防止未经授权的访问或修改: ### 合并和分割 PDF // Namespace: IronPdf using IronPdf; // Namespace: IronPdf.Editing using IronPdf.Editing; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1><p>Sensitive information...</p>"); // Apply password protection pdf.SecuritySettings.UserPassword = "user123"; // Required to open pdf.SecuritySettings.OwnerPassword = "owner456"; // Required to modify // Set detailed permissions pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserAnnotations = false; pdf.SecuritySettings.AllowUserFormData = true; pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint; // Add digital signature for authenticity pdf.SignWithFile( certificatePath: "certificate.pfx", certificatePassword: "certpass123", signingReason: "Document Approval", signingLocation: "New York, NY", signatureImage: new Signature("signature.png") { Width = 150, Height = 50 } ); // Apply redaction to hide sensitive information pdf.RedactTextOnPage( pageIndex: 0, searchText: "SSN: ***-**-****", replacementText: "[REDACTED]", caseSensitive: false ); // Save the secured PDF pdf.SaveAs("secure-confidential.pdf"); // Namespace: IronPdf using IronPdf; // Namespace: IronPdf.Editing using IronPdf.Editing; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1><p>Sensitive information...</p>"); // Apply password protection pdf.SecuritySettings.UserPassword = "user123"; // Required to open pdf.SecuritySettings.OwnerPassword = "owner456"; // Required to modify // Set detailed permissions pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserAnnotations = false; pdf.SecuritySettings.AllowUserFormData = true; pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint; // Add digital signature for authenticity pdf.SignWithFile( certificatePath: "certificate.pfx", certificatePassword: "certpass123", signingReason: "Document Approval", signingLocation: "New York, NY", signatureImage: new Signature("signature.png") { Width = 150, Height = 50 } ); // Apply redaction to hide sensitive information pdf.RedactTextOnPage( pageIndex: 0, searchText: "SSN: ***-**-****", replacementText: "[REDACTED]", caseSensitive: false ); // Save the secured PDF pdf.SaveAs("secure-confidential.pdf"); ' Namespace: IronPdf Imports IronPdf ' Namespace: IronPdf.Editing Imports IronPdf.Editing Private renderer = New ChromePdfRenderer() Private pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1><p>Sensitive information...</p>") ' Apply password protection pdf.SecuritySettings.UserPassword = "user123" ' Required to open pdf.SecuritySettings.OwnerPassword = "owner456" ' Required to modify ' Set detailed permissions pdf.SecuritySettings.AllowUserCopyPasteContent = False pdf.SecuritySettings.AllowUserAnnotations = False pdf.SecuritySettings.AllowUserFormData = True pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint ' Add digital signature for authenticity pdf.SignWithFile(certificatePath:= "certificate.pfx", certificatePassword:= "certpass123", signingReason:= "Document Approval", signingLocation:= "New York, NY", signatureImage:= New Signature("signature.png") With { .Width = 150, .Height = 50 }) ' Apply redaction to hide sensitive information pdf.RedactTextOnPage(pageIndex:= 0, searchText:= "SSN: ***-**-****", replacementText:= "[REDACTED]", caseSensitive:= False) ' Save the secured PDF pdf.SaveAs("secure-confidential.pdf") $vbLabelText $csharpLabel 组合多个 PDF 或提取特定页面对于文档管理工作流至关重要: 添加水印和印章 // Namespace: IronPdf using IronPdf; // Namespace: System using System; // Merge multiple PDFs into one document var coverPage = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Annual Report 2024</h1>"); var introduction = PdfDocument.FromFile("introduction.pdf"); var financials = PdfDocument.FromFile("financials.pdf"); var appendix = PdfDocument.FromFile("appendix.pdf"); // Merge all documents var completeReport = PdfDocument.Merge(coverPage, introduction, financials, appendix); // Add page numbers to the merged document for (int i = 0; i < completeReport.PageCount; i++) { completeReport.AddTextFooterToPage(i, $"Page {i + 1} of {completeReport.PageCount}", IronPdf.Font.FontTypes.Arial, 10); } completeReport.SaveAs("annual-report-complete.pdf"); // Extract specific pages var executiveSummary = completeReport.CopyPages(0, 4); // First 5 pages executiveSummary.SaveAs("executive-summary.pdf"); // Split a large PDF into chapters var sourcePdf = PdfDocument.FromFile("large-document.pdf"); var chaptersPerFile = 50; for (int i = 0; i < sourcePdf.PageCount; i += chaptersPerFile) { var endPage = Math.Min(i + chaptersPerFile - 1, sourcePdf.PageCount - 1); var chapter = sourcePdf.CopyPages(i, endPage); chapter.SaveAs($"chapter-{(i / chaptersPerFile) + 1}.pdf"); } // Namespace: IronPdf using IronPdf; // Namespace: System using System; // Merge multiple PDFs into one document var coverPage = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Annual Report 2024</h1>"); var introduction = PdfDocument.FromFile("introduction.pdf"); var financials = PdfDocument.FromFile("financials.pdf"); var appendix = PdfDocument.FromFile("appendix.pdf"); // Merge all documents var completeReport = PdfDocument.Merge(coverPage, introduction, financials, appendix); // Add page numbers to the merged document for (int i = 0; i < completeReport.PageCount; i++) { completeReport.AddTextFooterToPage(i, $"Page {i + 1} of {completeReport.PageCount}", IronPdf.Font.FontTypes.Arial, 10); } completeReport.SaveAs("annual-report-complete.pdf"); // Extract specific pages var executiveSummary = completeReport.CopyPages(0, 4); // First 5 pages executiveSummary.SaveAs("executive-summary.pdf"); // Split a large PDF into chapters var sourcePdf = PdfDocument.FromFile("large-document.pdf"); var chaptersPerFile = 50; for (int i = 0; i < sourcePdf.PageCount; i += chaptersPerFile) { var endPage = Math.Min(i + chaptersPerFile - 1, sourcePdf.PageCount - 1); var chapter = sourcePdf.CopyPages(i, endPage); chapter.SaveAs($"chapter-{(i / chaptersPerFile) + 1}.pdf"); } ' Namespace: IronPdf Imports IronPdf ' Namespace: System Imports System ' Merge multiple PDFs into one document Private coverPage = (New ChromePdfRenderer()).RenderHtmlAsPdf("<h1>Annual Report 2024</h1>") Private introduction = PdfDocument.FromFile("introduction.pdf") Private financials = PdfDocument.FromFile("financials.pdf") Private appendix = PdfDocument.FromFile("appendix.pdf") ' Merge all documents Private completeReport = PdfDocument.Merge(coverPage, introduction, financials, appendix) ' Add page numbers to the merged document Dim i As Integer = 0 Do While i < completeReport.PageCount completeReport.AddTextFooterToPage(i, $"Page {i + 1} of {completeReport.PageCount}", IronPdf.Font.FontTypes.Arial, 10) i += 1 Loop completeReport.SaveAs("annual-report-complete.pdf") ' Extract specific pages Dim executiveSummary = completeReport.CopyPages(0, 4) ' First 5 pages executiveSummary.SaveAs("executive-summary.pdf") ' Split a large PDF into chapters Dim sourcePdf = PdfDocument.FromFile("large-document.pdf") Dim chaptersPerFile = 50 For i As Integer = 0 To sourcePdf.PageCount - 1 Step chaptersPerFile Dim endPage = Math.Min(i + chaptersPerFile - 1, sourcePdf.PageCount - 1) Dim chapter = sourcePdf.CopyPages(i, endPage) chapter.SaveAs($"chapter-{(i \ chaptersPerFile) + 1}.pdf") Next i $vbLabelText $csharpLabel 为 PDF 添加水印对于文档控制和品牌推广至关重要。 IronPDF 支持文本和图像水印: ## 如何在大规模生成 PDF 时优化性能? // Namespace: IronPdf using IronPdf; // Namespace: System using System; var pdf = PdfDocument.FromFile("document.pdf"); // Add text watermark pdf.ApplyWatermark( html: "<h1 style='color: #ff0000; opacity: 0.5; font-size: 100px;'>DRAFT</h1>", rotation: 45, opacity: 50, verticalAlignment: VerticalAlignment.Middle, horizontalAlignment: HorizontalAlignment.Center ); // Add image watermark (company logo) pdf.ApplyWatermark( html: "<img src='logo-watermark.png' style='width: 300px;' />", rotation: 0, opacity: 30, verticalAlignment: VerticalAlignment.Bottom, horizontalAlignment: HorizontalAlignment.Right ); // Add stamps for document status pdf.StampHtml( Html: @"<div style='border: 3px solid green; padding: 10px; background: white; font-weight: bold; color: green;'> APPROVED<br/> " + DateTime.Now.ToString("MM/dd/yyyy") + @" </div>", X: 400, Y: 100, Width: 150, Height: 60, PageIndex: 0 ); pdf.SaveAs("watermarked-document.pdf"); // Namespace: IronPdf using IronPdf; // Namespace: System using System; var pdf = PdfDocument.FromFile("document.pdf"); // Add text watermark pdf.ApplyWatermark( html: "<h1 style='color: #ff0000; opacity: 0.5; font-size: 100px;'>DRAFT</h1>", rotation: 45, opacity: 50, verticalAlignment: VerticalAlignment.Middle, horizontalAlignment: HorizontalAlignment.Center ); // Add image watermark (company logo) pdf.ApplyWatermark( html: "<img src='logo-watermark.png' style='width: 300px;' />", rotation: 0, opacity: 30, verticalAlignment: VerticalAlignment.Bottom, horizontalAlignment: HorizontalAlignment.Right ); // Add stamps for document status pdf.StampHtml( Html: @"<div style='border: 3px solid green; padding: 10px; background: white; font-weight: bold; color: green;'> APPROVED<br/> " + DateTime.Now.ToString("MM/dd/yyyy") + @" </div>", X: 400, Y: 100, Width: 150, Height: 60, PageIndex: 0 ); pdf.SaveAs("watermarked-document.pdf"); ' Namespace: IronPdf Imports IronPdf ' Namespace: System Imports System Private pdf = PdfDocument.FromFile("document.pdf") ' Add text watermark pdf.ApplyWatermark(html:= "<h1 style='color: #ff0000; opacity: 0.5; font-size: 100px;'>DRAFT</h1>", rotation:= 45, opacity:= 50, verticalAlignment:= VerticalAlignment.Middle, horizontalAlignment:= HorizontalAlignment.Center) ' Add image watermark (company logo) pdf.ApplyWatermark(html:= "<img src='logo-watermark.png' style='width: 300px;' />", rotation:= 0, opacity:= 30, verticalAlignment:= VerticalAlignment.Bottom, horizontalAlignment:= HorizontalAlignment.Right) ' Add stamps for document status pdf.StampHtml(Html:= "<div style='border: 3px solid green; padding: 10px; background: white; font-weight: bold; color: green;'> APPROVED<br/> " & DateTime.Now.ToString("MM/dd/yyyy") & " </div>", X:= 400, Y:= 100, Width:= 150, Height:= 60, PageIndex:= 0) pdf.SaveAs("watermarked-document.pdf") $vbLabelText $csharpLabel 当大规模生成 PDF时,性能变得至关重要。 无论您是在创建成千上万的发票还是处理大型批量作业,优化您的 PDF 生成 代码都可以显著提高吞吐量并减少资源消耗。 现代应用程序需要高效的 C# 中创建 PDF 的能力,不会阻塞线程或消耗过多内存。 这里是一些可靠的提升性能的策略,以便在不同的 PDF 生成任务中最大化性能,当您需要高效地在 .NET 中生成 PDF时。 ### 异步 PDF 生成 现代应用程序需要非阻塞操作以保持响应性。 IronPDF 提供了主要操作的异步方法: ### 批量处理最佳实践 // Namespace: IronPdf using IronPdf; // Namespace: System.Threading.Tasks using System.Threading.Tasks; // Namespace: System.Collections.Generic using System.Collections.Generic; // Namespace: System.Linq using System.Linq; // Namespace: System using System; // Namespace: System.Threading using System.Threading; public class AsyncPdfService { private readonly ChromePdfRenderer _renderer; public AsyncPdfService() { _renderer = new ChromePdfRenderer(); // Configure renderer once for reuse _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; } public async Task<byte[]> GeneratePdfAsync(string html) { // Non-blocking PDF generation var pdf = await _renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } public async Task GenerateBatchAsync(List<string> htmlDocuments) { // Process multiple PDFs concurrently var tasks = htmlDocuments.Select(async (html, index) => { var pdf = await _renderer.RenderHtmlAsPdfAsync(html); await pdf.SaveAsAsync($"document-{index}.pdf"); }); await Task.WhenAll(tasks); } // Async with cancellation support public async Task<PdfDocument> GenerateWithTimeoutAsync(string html, int timeoutSeconds) { using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds)); try { return await _renderer.RenderHtmlAsPdfAsync(html, cts.Token); } catch (OperationCanceledException) { throw new TimeoutException("PDF generation exceeded timeout"); } } } // Namespace: IronPdf using IronPdf; // Namespace: System.Threading.Tasks using System.Threading.Tasks; // Namespace: System.Collections.Generic using System.Collections.Generic; // Namespace: System.Linq using System.Linq; // Namespace: System using System; // Namespace: System.Threading using System.Threading; public class AsyncPdfService { private readonly ChromePdfRenderer _renderer; public AsyncPdfService() { _renderer = new ChromePdfRenderer(); // Configure renderer once for reuse _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; } public async Task<byte[]> GeneratePdfAsync(string html) { // Non-blocking PDF generation var pdf = await _renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } public async Task GenerateBatchAsync(List<string> htmlDocuments) { // Process multiple PDFs concurrently var tasks = htmlDocuments.Select(async (html, index) => { var pdf = await _renderer.RenderHtmlAsPdfAsync(html); await pdf.SaveAsAsync($"document-{index}.pdf"); }); await Task.WhenAll(tasks); } // Async with cancellation support public async Task<PdfDocument> GenerateWithTimeoutAsync(string html, int timeoutSeconds) { using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds)); try { return await _renderer.RenderHtmlAsPdfAsync(html, cts.Token); } catch (OperationCanceledException) { throw new TimeoutException("PDF generation exceeded timeout"); } } } ' Namespace: IronPdf Imports IronPdf ' Namespace: System.Threading.Tasks Imports System.Threading.Tasks ' Namespace: System.Collections.Generic Imports System.Collections.Generic ' Namespace: System.Linq Imports System.Linq ' Namespace: System Imports System ' Namespace: System.Threading Imports System.Threading Public Class AsyncPdfService Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer() ' Configure renderer once for reuse _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 End Sub Public Async Function GeneratePdfAsync(ByVal html As String) As Task(Of Byte()) ' Non-blocking PDF generation Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) Return pdf.BinaryData End Function Public Async Function GenerateBatchAsync(ByVal htmlDocuments As List(Of String)) As Task ' Process multiple PDFs concurrently Dim tasks = htmlDocuments.Select(Async Function(html, index) Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) Await pdf.SaveAsAsync($"document-{index}.pdf") End Function) Await Task.WhenAll(tasks) End Function ' Async with cancellation support Public Async Function GenerateWithTimeoutAsync(ByVal html As String, ByVal timeoutSeconds As Integer) As Task(Of PdfDocument) Dim cts = New CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds)) Try Return Await _renderer.RenderHtmlAsPdfAsync(html, cts.Token) Catch e1 As OperationCanceledException Throw New TimeoutException("PDF generation exceeded timeout") End Try End Function End Class $vbLabelText $csharpLabel 在处理多个 PDF 时,适当的资源管理和并行处理可以显著提高性能: 内存优化技术 using IronPdf; using System.Threading.Tasks.Dataflow; public class BatchPdfProcessor { private readonly ChromePdfRenderer _renderer; private readonly ActionBlock<PdfJob> _processingBlock; public BatchPdfProcessor(int maxConcurrency = 4) { _renderer = new ChromePdfRenderer(); // Create a processing pipeline with controlled concurrency _processingBlock = new ActionBlock<PdfJob>( async job => await ProcessPdfAsync(job), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = maxConcurrency, BoundedCapacity = maxConcurrency * 2 }); } private async Task ProcessPdfAsync(PdfJob job) { try { var pdf = await _renderer.RenderHtmlAsPdfAsync(job.Html); await pdf.SaveAsAsync(job.OutputPath); job.OnSuccess?.Invoke(); } catch (Exception ex) { job.OnError?.Invoke(ex); } } public async Task<bool> QueuePdfAsync(PdfJob job) { return await _processingBlock.SendAsync(job); } public async Task CompleteAsync() { _processingBlock.Complete(); await _processingBlock.Completion; } } public class PdfJob { public string Html { get; set; } public string OutputPath { get; set; } public Action OnSuccess { get; set; } public Action<Exception> OnError { get; set; } } using IronPdf; using System.Threading.Tasks.Dataflow; public class BatchPdfProcessor { private readonly ChromePdfRenderer _renderer; private readonly ActionBlock<PdfJob> _processingBlock; public BatchPdfProcessor(int maxConcurrency = 4) { _renderer = new ChromePdfRenderer(); // Create a processing pipeline with controlled concurrency _processingBlock = new ActionBlock<PdfJob>( async job => await ProcessPdfAsync(job), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = maxConcurrency, BoundedCapacity = maxConcurrency * 2 }); } private async Task ProcessPdfAsync(PdfJob job) { try { var pdf = await _renderer.RenderHtmlAsPdfAsync(job.Html); await pdf.SaveAsAsync(job.OutputPath); job.OnSuccess?.Invoke(); } catch (Exception ex) { job.OnError?.Invoke(ex); } } public async Task<bool> QueuePdfAsync(PdfJob job) { return await _processingBlock.SendAsync(job); } public async Task CompleteAsync() { _processingBlock.Complete(); await _processingBlock.Completion; } } public class PdfJob { public string Html { get; set; } public string OutputPath { get; set; } public Action OnSuccess { get; set; } public Action<Exception> OnError { get; set; } } Imports IronPdf Imports System.Threading.Tasks.Dataflow Public Class BatchPdfProcessor Private ReadOnly _renderer As ChromePdfRenderer Private ReadOnly _processingBlock As ActionBlock(Of PdfJob) Public Sub New(Optional ByVal maxConcurrency As Integer = 4) _renderer = New ChromePdfRenderer() ' Create a processing pipeline with controlled concurrency _processingBlock = New ActionBlock(Of PdfJob)(Async Function(job) Await ProcessPdfAsync(job), New ExecutionDataflowBlockOptions With { .MaxDegreeOfParallelism = maxConcurrency, .BoundedCapacity = maxConcurrency * 2 }) End Sub Private Async Function ProcessPdfAsync(ByVal job As PdfJob) As Task Try Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(job.Html) Await pdf.SaveAsAsync(job.OutputPath) If job.OnSuccess IsNot Nothing Then job.OnSuccess.Invoke() End If Catch ex As Exception If job.OnError IsNot Nothing Then job.OnError.Invoke(ex) End If End Try End Function Public Async Function QueuePdfAsync(ByVal job As PdfJob) As Task(Of Boolean) Return Await _processingBlock.SendAsync(job) End Function Public Async Function CompleteAsync() As Task _processingBlock.Complete() Await _processingBlock.Completion End Function End Class Public Class PdfJob Public Property Html() As String Public Property OutputPath() As String Public Property OnSuccess() As Action Public Property OnError() As Action(Of Exception) End Class $vbLabelText $csharpLabel 对于大型 PDF 或高容量处理,内存管理至关重要: 缓存和模板优化 using IronPdf; public class MemoryEfficientPdfGenerator { private readonly ChromePdfRenderer _renderer; public MemoryEfficientPdfGenerator() { _renderer = new ChromePdfRenderer(); // Optimize for memory usage _renderer.RenderingOptions.RenderQuality = 90; // Slightly lower quality for smaller size _renderer.RenderingOptions.ImageQuality = 85; // Compress images } // Stream large PDFs instead of loading into memory public async Task GenerateLargePdfToStreamAsync(string html, Stream outputStream) { var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Write directly to stream without keeping in memory using (pdf) { var bytes = pdf.BinaryData; await outputStream.WriteAsync(bytes, 0, bytes.Length); } } // Process large HTML in chunks public async Task<PdfDocument> GenerateFromChunksAsync(List<string> htmlChunks) { var pdfs = new List<PdfDocument>(); try { // Generate each chunk separately foreach (var chunk in htmlChunks) { var chunkPdf = await _renderer.RenderHtmlAsPdfAsync(chunk); pdfs.Add(chunkPdf); } // Merge all chunks return PdfDocument.Merge(pdfs.ToArray()); } finally { // Ensure all temporary PDFs are disposed foreach (var pdf in pdfs) { pdf?.Dispose(); } } } } using IronPdf; public class MemoryEfficientPdfGenerator { private readonly ChromePdfRenderer _renderer; public MemoryEfficientPdfGenerator() { _renderer = new ChromePdfRenderer(); // Optimize for memory usage _renderer.RenderingOptions.RenderQuality = 90; // Slightly lower quality for smaller size _renderer.RenderingOptions.ImageQuality = 85; // Compress images } // Stream large PDFs instead of loading into memory public async Task GenerateLargePdfToStreamAsync(string html, Stream outputStream) { var pdf = await _renderer.RenderHtmlAsPdfAsync(html); // Write directly to stream without keeping in memory using (pdf) { var bytes = pdf.BinaryData; await outputStream.WriteAsync(bytes, 0, bytes.Length); } } // Process large HTML in chunks public async Task<PdfDocument> GenerateFromChunksAsync(List<string> htmlChunks) { var pdfs = new List<PdfDocument>(); try { // Generate each chunk separately foreach (var chunk in htmlChunks) { var chunkPdf = await _renderer.RenderHtmlAsPdfAsync(chunk); pdfs.Add(chunkPdf); } // Merge all chunks return PdfDocument.Merge(pdfs.ToArray()); } finally { // Ensure all temporary PDFs are disposed foreach (var pdf in pdfs) { pdf?.Dispose(); } } } } Imports IronPdf Public Class MemoryEfficientPdfGenerator Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer() ' Optimize for memory usage _renderer.RenderingOptions.RenderQuality = 90 ' Slightly lower quality for smaller size _renderer.RenderingOptions.ImageQuality = 85 ' Compress images End Sub ' Stream large PDFs instead of loading into memory Public Async Function GenerateLargePdfToStreamAsync(ByVal html As String, ByVal outputStream As Stream) As Task Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) ' Write directly to stream without keeping in memory Using pdf Dim bytes = pdf.BinaryData Await outputStream.WriteAsync(bytes, 0, bytes.Length) End Using End Function ' Process large HTML in chunks Public Async Function GenerateFromChunksAsync(ByVal htmlChunks As List(Of String)) As Task(Of PdfDocument) Dim pdfs = New List(Of PdfDocument)() Try ' Generate each chunk separately For Each chunk In htmlChunks Dim chunkPdf = Await _renderer.RenderHtmlAsPdfAsync(chunk) pdfs.Add(chunkPdf) Next chunk ' Merge all chunks Return PdfDocument.Merge(pdfs.ToArray()) Finally ' Ensure all temporary PDFs are disposed For Each pdf In pdfs If pdf IsNot Nothing Then pdf.Dispose() End If Next pdf End Try End Function End Class $vbLabelText $csharpLabel 通过缓存常用元素和优化模板来减少渲染时间: 创建 PDF 时常见问题有哪些,我如何解决这些问题? using IronPdf; using Microsoft.Extensions.Caching.Memory; public class CachedPdfService { private readonly ChromePdfRenderer _renderer; private readonly IMemoryCache _cache; private readonly Dictionary<string, string> _compiledTemplates; public CachedPdfService(IMemoryCache cache) { _renderer = new ChromePdfRenderer(); _cache = cache; _compiledTemplates = new Dictionary<string, string>(); // Pre-compile common templates PrecompileTemplates(); } private void PrecompileTemplates() { // Load and cache common CSS var commonCss = File.ReadAllText("Templates/common.css"); _compiledTemplates["commonCss"] = commonCss; // Cache logo as Base64 var logoBytes = File.ReadAllBytes("Assets/logo.png"); var logoBase64 = Convert.ToBase64String(logoBytes); _compiledTemplates["logoData"] = $"data:image/png;base64,{logoBase64}"; } public async Task<byte[]> GenerateInvoicePdfAsync(string invoiceId, InvoiceData data) { // Check cache first var cacheKey = $"invoice_{invoiceId}"; if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf)) { return cachedPdf; } // Generate PDF with cached templates var html = BuildHtmlWithCache(data); var pdf = await _renderer.RenderHtmlAsPdfAsync(html); var pdfBytes = pdf.BinaryData; // Cache for 1 hour _cache.Set(cacheKey, pdfBytes, TimeSpan.FromHours(1)); return pdfBytes; } private string BuildHtmlWithCache(InvoiceData data) { return $@" <html> <head> <style>{_compiledTemplates["commonCss"]}</style> </head> <body> <img src='{_compiledTemplates["logoData"]}' /> <!-- Rest of invoice HTML --> </body> </html>"; } } using IronPdf; using Microsoft.Extensions.Caching.Memory; public class CachedPdfService { private readonly ChromePdfRenderer _renderer; private readonly IMemoryCache _cache; private readonly Dictionary<string, string> _compiledTemplates; public CachedPdfService(IMemoryCache cache) { _renderer = new ChromePdfRenderer(); _cache = cache; _compiledTemplates = new Dictionary<string, string>(); // Pre-compile common templates PrecompileTemplates(); } private void PrecompileTemplates() { // Load and cache common CSS var commonCss = File.ReadAllText("Templates/common.css"); _compiledTemplates["commonCss"] = commonCss; // Cache logo as Base64 var logoBytes = File.ReadAllBytes("Assets/logo.png"); var logoBase64 = Convert.ToBase64String(logoBytes); _compiledTemplates["logoData"] = $"data:image/png;base64,{logoBase64}"; } public async Task<byte[]> GenerateInvoicePdfAsync(string invoiceId, InvoiceData data) { // Check cache first var cacheKey = $"invoice_{invoiceId}"; if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf)) { return cachedPdf; } // Generate PDF with cached templates var html = BuildHtmlWithCache(data); var pdf = await _renderer.RenderHtmlAsPdfAsync(html); var pdfBytes = pdf.BinaryData; // Cache for 1 hour _cache.Set(cacheKey, pdfBytes, TimeSpan.FromHours(1)); return pdfBytes; } private string BuildHtmlWithCache(InvoiceData data) { return $@" <html> <head> <style>{_compiledTemplates["commonCss"]}</style> </head> <body> <img src='{_compiledTemplates["logoData"]}' /> <!-- Rest of invoice HTML --> </body> </html>"; } } Imports IronPdf Imports Microsoft.Extensions.Caching.Memory Public Class CachedPdfService Private ReadOnly _renderer As ChromePdfRenderer Private ReadOnly _cache As IMemoryCache Private ReadOnly _compiledTemplates As Dictionary(Of String, String) Public Sub New(ByVal cache As IMemoryCache) _renderer = New ChromePdfRenderer() _cache = cache _compiledTemplates = New Dictionary(Of String, String)() ' Pre-compile common templates PrecompileTemplates() End Sub Private Sub PrecompileTemplates() ' Load and cache common CSS Dim commonCss = File.ReadAllText("Templates/common.css") _compiledTemplates("commonCss") = commonCss ' Cache logo as Base64 Dim logoBytes = File.ReadAllBytes("Assets/logo.png") Dim logoBase64 = Convert.ToBase64String(logoBytes) _compiledTemplates("logoData") = $"data:image/png;base64,{logoBase64}" End Sub Public Async Function GenerateInvoicePdfAsync(ByVal invoiceId As String, ByVal data As InvoiceData) As Task(Of Byte()) ' Check cache first Dim cacheKey = $"invoice_{invoiceId}" Dim cachedPdf As var If _cache.TryGetValue(Of Byte())(cacheKey, cachedPdf) Then Return cachedPdf End If ' Generate PDF with cached templates Dim html = BuildHtmlWithCache(data) Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) Dim pdfBytes = pdf.BinaryData ' Cache for 1 hour _cache.Set(cacheKey, pdfBytes, TimeSpan.FromHours(1)) Return pdfBytes End Function Private Function BuildHtmlWithCache(ByVal data As InvoiceData) As String Return $" <html> <head> <style>{_compiledTemplates("commonCss")}</style>ignoreignoreignore</head><body><img src='{_compiledTemplates("logoData")}' /><!-- Rest of invoice HTML --></body></html>" End Function End Class $vbLabelText $csharpLabel 即使使用像IronPDF这样的强大 .NET PDF 库,在开发或部署时您仍可能会遇到挑战, 当您在 C# 中创建 PDF时。 了解常见问题及其解决方案有助于您快速解决问题并维护流畅的PDF 生成操作。 好消息是,随着超过 1400 万开发人员使用IronPDF作为他们的 C# PDF 生成器,大多数问题都已被遇到并解决。 此故障排除指南涵盖了开发人员在他们在 .NET 中创建 PDF时面临的最常见问题,并提供了基于现实世界经验的实用解决方案。 别忘了,如果您在处理PDF 创建挑战时需立即协助,24/7 支持始终可用。 ### 问题 1:渲染失败或空白 PDF 最常见的问题之一是 PDF 看起来空白或无法正确渲染。 这通常发生在资源未及时加载或存在JavaScript 时序问题时: 对于持久的渲染问题,启用日志功能以诊断问题: // Namespace: IronPdf using IronPdf; // Namespace: System.IO using System.IO; // Namespace: System using System; // Problem: PDF is blank or missing content var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(complexHtml); // Results in blank PDF // Solution 1: Add render delay for JavaScript-heavy content renderer.RenderingOptions.RenderDelay = 3000; // Wait 3 seconds renderer.RenderingOptions.EnableJavaScript = true; // Solution 2: Wait for specific elements renderer.RenderingOptions.WaitFor = new WaitFor() { JavaScriptQuery = "document.querySelector('#chart-loaded') !== null", WaitForType = WaitForType.JavaScript, Timeout = 30000 // 30 second timeout }; // Solution 3: Use base path for local assets var basePath = Path.GetFullPath("Assets"); var pdf = renderer.RenderHtmlAsPdf(htmlWithImages, basePath); // Solution 4: Embed assets as Base64 var imageBase64 = Convert.ToBase64String(File.ReadAllBytes("logo.png")); var htmlWithEmbedded = $@"<img src='data:image/png;base64,{imageBase64}' />"; // Namespace: IronPdf using IronPdf; // Namespace: System.IO using System.IO; // Namespace: System using System; // Problem: PDF is blank or missing content var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(complexHtml); // Results in blank PDF // Solution 1: Add render delay for JavaScript-heavy content renderer.RenderingOptions.RenderDelay = 3000; // Wait 3 seconds renderer.RenderingOptions.EnableJavaScript = true; // Solution 2: Wait for specific elements renderer.RenderingOptions.WaitFor = new WaitFor() { JavaScriptQuery = "document.querySelector('#chart-loaded') !== null", WaitForType = WaitForType.JavaScript, Timeout = 30000 // 30 second timeout }; // Solution 3: Use base path for local assets var basePath = Path.GetFullPath("Assets"); var pdf = renderer.RenderHtmlAsPdf(htmlWithImages, basePath); // Solution 4: Embed assets as Base64 var imageBase64 = Convert.ToBase64String(File.ReadAllBytes("logo.png")); var htmlWithEmbedded = $@"<img src='data:image/png;base64,{imageBase64}' />"; ' Namespace: IronPdf Imports IronPdf ' Namespace: System.IO Imports System.IO ' Namespace: System Imports System ' Problem: PDF is blank or missing content Private renderer = New ChromePdfRenderer() Private pdf = renderer.RenderHtmlAsPdf(complexHtml) ' Results in blank PDF ' Solution 1: Add render delay for JavaScript-heavy content renderer.RenderingOptions.RenderDelay = 3000 ' Wait 3 seconds renderer.RenderingOptions.EnableJavaScript = True ' Solution 2: Wait for specific elements renderer.RenderingOptions.WaitFor = New WaitFor() With { .JavaScriptQuery = "document.querySelector('#chart-loaded') !== null", .WaitForType = WaitForType.JavaScript, .Timeout = 30000 } ' Solution 3: Use base path for local assets Dim basePath = Path.GetFullPath("Assets") Dim pdf = renderer.RenderHtmlAsPdf(htmlWithImages, basePath) ' Solution 4: Embed assets as Base64 Dim imageBase64 = Convert.ToBase64String(File.ReadAllBytes("logo.png")) Dim htmlWithEmbedded = $"<img src='data:image/png;base64,{imageBase64}' />" $vbLabelText $csharpLabel 了解更多关于渲染问题的故障排除 // Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "IronPdf.log"; IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All; // Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "IronPdf.log"; IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All; ' Enable detailed logging IronPdf.Logging.Logger.EnableDebugging = True IronPdf.Logging.Logger.LogFilePath = "IronPdf.log" IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All $vbLabelText $csharpLabel 问题 2:初始渲染缓慢 第一个 PDF 生成可能由于初始化开销而较慢。 IronPDF 的初始渲染可能需要 2-3 秒执行,这在桌面环境下类似于 Chrome 打开时的正常启动时间: 阅读更多有关优化启动性能的信息 // Problem: First PDF takes too long to generate public class PdfService { private ChromePdfRenderer _renderer; // Solution 1: Initialize renderer at startup public void Initialize() { _renderer = new ChromePdfRenderer(); // Warm up the renderer _ = _renderer.RenderHtmlAsPdf("<p>Warm up</p>"); } // Solution 2: Use IronPdf.Native packages for faster initialization // Install-Package IronPdf.Native.Windows.X64 // This includes pre-loaded binaries for your platform // Solution 3: For cloud deployments, use appropriate packages // For Linux: Install-Package IronPdf.Linux // For Docker: Use IronPdf.Linux with proper dependencies } // Solution 4: Skip initialization checks in production IronPdf.Installation.SkipInitialization = true; // Use only with persistent storage // Problem: First PDF takes too long to generate public class PdfService { private ChromePdfRenderer _renderer; // Solution 1: Initialize renderer at startup public void Initialize() { _renderer = new ChromePdfRenderer(); // Warm up the renderer _ = _renderer.RenderHtmlAsPdf("<p>Warm up</p>"); } // Solution 2: Use IronPdf.Native packages for faster initialization // Install-Package IronPdf.Native.Windows.X64 // This includes pre-loaded binaries for your platform // Solution 3: For cloud deployments, use appropriate packages // For Linux: Install-Package IronPdf.Linux // For Docker: Use IronPdf.Linux with proper dependencies } // Solution 4: Skip initialization checks in production IronPdf.Installation.SkipInitialization = true; // Use only with persistent storage ' Problem: First PDF takes too long to generate Public Class PdfService Private _renderer As ChromePdfRenderer ' Solution 1: Initialize renderer at startup Public Sub Initialize() _renderer = New ChromePdfRenderer() ' Warm up the renderer 'INSTANT VB TODO TASK: Underscore 'discards' are not converted by Instant VB: 'ORIGINAL LINE: _ = _renderer.RenderHtmlAsPdf("<p>Warm up</p>"); underscore = _renderer.RenderHtmlAsPdf("<p>Warm up</p>") End Sub ' Solution 2: Use IronPdf.Native packages for faster initialization ' Install-Package IronPdf.Native.Windows.X64 ' This includes pre-loaded binaries for your platform ' Solution 3: For cloud deployments, use appropriate packages ' For Linux: Install-Package IronPdf.Linux ' For Docker: Use IronPdf.Linux with proper dependencies End Class ' Solution 4: Skip initialization checks in production IronPdf.Installation.SkipInitialization = True ' Use only with persistent storage $vbLabelText $csharpLabel 问题 3:Linux/Docker 上的部署问题 IronPDF 需要特定的 Linux 依赖项,这在最小化的 Docker 镜像中可能不存在。 以下是解决常见部署问题的方法: 特别是在 Google Cloud Run 环境中: # Dockerfile forIronPDFon Linux FROM mcr.microsoft.com/dotnet/aspnet:8.0 # Install required dependencies RUN apt-get update && apt-get install -y \ libglib2.0-0 \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ libgbm1 \ libpango-1.0-0 \ libcairo2 \ libasound2 \ libxshmfence1 \ libx11-xcb1 # Copy and run your application WORKDIR /app COPY . . ENTRYPOINT ["dotnet", "YourApp.dll"] 了解更多关于 Docker 部署的信息 // Use 2nd generation execution environment // Deploy with: gcloud run deploy --execution-environment gen2 // In your code, ensure compatibility IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true; IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled; // Use 2nd generation execution environment // Deploy with: gcloud run deploy --execution-environment gen2 // In your code, ensure compatibility IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true; IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled; ' Use 2nd generation execution environment ' Deploy with: gcloud run deploy --execution-environment gen2 ' In your code, ensure compatibility IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled $vbLabelText $csharpLabel 问题 4:内存和性能问题 对于高容量 PDF 生成,优化内存使用和性能: 阅读完整的性能优化指南 // Problem: High memory usage or slow batch processing public class OptimizedPdfService { private readonly ChromePdfRenderer _renderer; public OptimizedPdfService() { _renderer = new ChromePdfRenderer(); // Optimize for performance _renderer.RenderingOptions.RenderQuality = 90; _renderer.RenderingOptions.ImageQuality = 85; // Disable features you don't need _renderer.RenderingOptions.EnableJavaScript = false; // If not needed _renderer.RenderingOptions.RenderDelay = 0; // If content is static } // Solution 1: Process large documents in chunks public async Task<PdfDocument> GenerateLargeReportAsync(List<ReportSection> sections) { var pdfs = new List<PdfDocument>(); foreach (var section in sections) { var sectionHtml = GenerateSectionHtml(section); var sectionPdf = await _renderer.RenderHtmlAsPdfAsync(sectionHtml); pdfs.Add(sectionPdf); // Force garbage collection after each section if (pdfs.Count % 10 == 0) { GC.Collect(); GC.WaitForPendingFinalizers(); } } return PdfDocument.Merge(pdfs.ToArray()); } // Solution 2: Use streaming for large files public async Task StreamLargePdfAsync(string html, HttpResponse response) { response.ContentType = "application/pdf"; response.Headers.Add("Content-Disposition", "attachment; filename=report.pdf"); var pdf = await _renderer.RenderHtmlAsPdfAsync(html); var bytes = pdf.BinaryData; await response.Body.WriteAsync(bytes, 0, bytes.Length); await response.Body.FlushAsync(); } } // Problem: High memory usage or slow batch processing public class OptimizedPdfService { private readonly ChromePdfRenderer _renderer; public OptimizedPdfService() { _renderer = new ChromePdfRenderer(); // Optimize for performance _renderer.RenderingOptions.RenderQuality = 90; _renderer.RenderingOptions.ImageQuality = 85; // Disable features you don't need _renderer.RenderingOptions.EnableJavaScript = false; // If not needed _renderer.RenderingOptions.RenderDelay = 0; // If content is static } // Solution 1: Process large documents in chunks public async Task<PdfDocument> GenerateLargeReportAsync(List<ReportSection> sections) { var pdfs = new List<PdfDocument>(); foreach (var section in sections) { var sectionHtml = GenerateSectionHtml(section); var sectionPdf = await _renderer.RenderHtmlAsPdfAsync(sectionHtml); pdfs.Add(sectionPdf); // Force garbage collection after each section if (pdfs.Count % 10 == 0) { GC.Collect(); GC.WaitForPendingFinalizers(); } } return PdfDocument.Merge(pdfs.ToArray()); } // Solution 2: Use streaming for large files public async Task StreamLargePdfAsync(string html, HttpResponse response) { response.ContentType = "application/pdf"; response.Headers.Add("Content-Disposition", "attachment; filename=report.pdf"); var pdf = await _renderer.RenderHtmlAsPdfAsync(html); var bytes = pdf.BinaryData; await response.Body.WriteAsync(bytes, 0, bytes.Length); await response.Body.FlushAsync(); } } ' Problem: High memory usage or slow batch processing Public Class OptimizedPdfService Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer() ' Optimize for performance _renderer.RenderingOptions.RenderQuality = 90 _renderer.RenderingOptions.ImageQuality = 85 ' Disable features you don't need _renderer.RenderingOptions.EnableJavaScript = False ' If not needed _renderer.RenderingOptions.RenderDelay = 0 ' If content is static End Sub ' Solution 1: Process large documents in chunks Public Async Function GenerateLargeReportAsync(ByVal sections As List(Of ReportSection)) As Task(Of PdfDocument) Dim pdfs = New List(Of PdfDocument)() For Each section In sections Dim sectionHtml = GenerateSectionHtml(section) Dim sectionPdf = Await _renderer.RenderHtmlAsPdfAsync(sectionHtml) pdfs.Add(sectionPdf) ' Force garbage collection after each section If pdfs.Count Mod 10 = 0 Then GC.Collect() GC.WaitForPendingFinalizers() End If Next section Return PdfDocument.Merge(pdfs.ToArray()) End Function ' Solution 2: Use streaming for large files Public Async Function StreamLargePdfAsync(ByVal html As String, ByVal response As HttpResponse) As Task response.ContentType = "application/pdf" response.Headers.Add("Content-Disposition", "attachment; filename=report.pdf") Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html) Dim bytes = pdf.BinaryData Await response.Body.WriteAsync(bytes, 0, bytes.Length) Await response.Body.FlushAsync() End Function End Class $vbLabelText $csharpLabel 问题 5:字体和编码问题 在处理国际内容或自定义字体时: 获取帮助 // Problem: Fonts not rendering correctly var renderer = new ChromePdfRenderer(); // Solution 1: Install fonts on the server // For Linux/Docker, add to Dockerfile: // RUN apt-get install -y fonts-liberation fonts-noto // Solution 2: Embed fonts in HTML var html = @" <html> <head> <style> @font-face { font-family: 'CustomFont'; src: url('data:font/woff2;base64,[base64-encoded-font]') format('woff2'); } body { font-family: 'CustomFont', Arial, sans-serif; } </style> </head> <body> <p>Content with custom font</p> </body> </html>"; // Solution 3: Use web fonts var htmlWithWebFont = @" <html> <head> <link href='https://fonts.googleapis.com/css2?family=Noto+Sans+JP' rel='stylesheet'> <style> body { font-family: 'Noto Sans JP', sans-serif; } </style> </head> <body> <p>日本語のテキスト</p> </body> </html>"; // Ensure proper encoding renderer.RenderingOptions.InputEncoding = Encoding.UTF8; // Problem: Fonts not rendering correctly var renderer = new ChromePdfRenderer(); // Solution 1: Install fonts on the server // For Linux/Docker, add to Dockerfile: // RUN apt-get install -y fonts-liberation fonts-noto // Solution 2: Embed fonts in HTML var html = @" <html> <head> <style> @font-face { font-family: 'CustomFont'; src: url('data:font/woff2;base64,[base64-encoded-font]') format('woff2'); } body { font-family: 'CustomFont', Arial, sans-serif; } </style> </head> <body> <p>Content with custom font</p> </body> </html>"; // Solution 3: Use web fonts var htmlWithWebFont = @" <html> <head> <link href='https://fonts.googleapis.com/css2?family=Noto+Sans+JP' rel='stylesheet'> <style> body { font-family: 'Noto Sans JP', sans-serif; } </style> </head> <body> <p>日本語のテキスト</p> </body> </html>"; // Ensure proper encoding renderer.RenderingOptions.InputEncoding = Encoding.UTF8; ' Problem: Fonts not rendering correctly Dim renderer = New ChromePdfRenderer() ' Solution 1: Install fonts on the server ' For Linux/Docker, add to Dockerfile: ' RUN apt-get install -y fonts-liberation fonts-noto ' Solution 2: Embed fonts in HTML Dim html = " <html> <head> <style> @font-face { font-family: 'CustomFont'; src: url('data:font/woff2;base64,[base64-encoded-font]') format('woff2'); } body { font-family: 'CustomFont', Arial, sans-serif; } </style> </head> <body> <p>Content with custom font</p> </body> </html>" ' Solution 3: Use web fonts Dim htmlWithWebFont = " <html> <head> <link href='https://fonts.googleapis.com/css2?family=Noto+Sans+JP' rel='stylesheet'> <style> body { font-family: 'Noto Sans JP', sans-serif; } </style> </head> <body> <p>日本語のテキスト</p> </body> </html>" ' Ensure proper encoding renderer.RenderingOptions.InputEncoding = Encoding.UTF8 $vbLabelText $csharpLabel 如果您遇到此处未覆盖的问题,IronPDF 提供了优秀的支持资源: 24/7 在线聊天支持 - 实时与工程师交流,响应时间 30 秒 全面文档 - 详细的 API 参考和指南 知识库 - 常见问题的解决方案 代码示例 - 可直接使用的代码片段 请求支持时,请包含: -IronPDF版本 .NET 版本和平台 导致问题的最小代码示例 日志文件(如果有) 堆栈跟踪或错误消息 哪些平台支持IronPDF进行 PDF 生成? IronPDF 的跨平台支持确保您的 PDF 生成 代码在不同环境中始终如一地工作。 无论您是部署到 Windows 服务器、Linux 容器或云平台,IronPDF 都提供生产部署必须的灵活性和可靠性,满足您的 C# PDF 生成器 需求。 这种通用兼容性是为什么 50多个国家的组织 每日依赖IronPDF来 生成数百万个 PDF。 从《财富》500 强公司 创建财务报告 到创业公司 生成客户发票,IronPDF 能满足任何对 PDF 在 .NET 中创建 的需求。 了解平台特定的考虑因素有助于确保您基础设施的平稳部署 - 无论是在云环境中,您都需要在 以 C# 建立 PDF时。 Understanding platform-specific considerations helps ensure smooth deployments across your infrastructure - whether that's on-premise servers or cloud environments where you need to build PDFs with C#. IronPDF 支持所有现代 .NET 版本,并持续更新以支持最新版本: .NET 8 - 支持所有功能 .NET 9 - 完全支持(目前最新版本) .NET 10 - 提前支持(IronPDF 已符合 2025 年 11 月发布) .NET 7, 6, 5 - 完全支持 .NET Core 3.1+ - 支持所有功能 .NET Framework 4.6.2+ - 维护旧版本支持 操作系统支持 在任何主要操作系统上部署您的 PDF 生成解决方案: Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) Alpine Linux(需要额外配置) macOS 13(Ventura)及更新版本 macOS 13(Ventura)及更新版本 Apple Silicon (M1/M2/M3)原生支持 Intel-based Macs 完全支持 云平台部署 IronPDF 在所有主要云平台上无缝工作: 微软 Azure 亚马逊网络服务(AWS) // Azure App Service configuration // Use at least B1 tier for optimal performance // Enable 64-bit platform in Configuration settings // For Azure Functions public static class PdfFunction { [FunctionName("GeneratePdf")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req) { var renderer = new ChromePdfRenderer(); var html = await new StreamReader(req.Body).ReadToEndAsync(); var pdf = await renderer.RenderHtmlAsPdfAsync(html); return new FileContentResult(pdf.BinaryData, "application/pdf"); } } // Azure App Service configuration // Use at least B1 tier for optimal performance // Enable 64-bit platform in Configuration settings // For Azure Functions public static class PdfFunction { [FunctionName("GeneratePdf")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req) { var renderer = new ChromePdfRenderer(); var html = await new StreamReader(req.Body).ReadToEndAsync(); var pdf = await renderer.RenderHtmlAsPdfAsync(html); return new FileContentResult(pdf.BinaryData, "application/pdf"); } } ' Azure App Service configuration ' Use at least B1 tier for optimal performance ' Enable 64-bit platform in Configuration settings ' For Azure Functions Public Module PdfFunction <FunctionName("GeneratePdf")> Public Async Function Run(<HttpTrigger(AuthorizationLevel.Function, "post")> ByVal req As HttpRequest) As Task(Of IActionResult) Dim renderer = New ChromePdfRenderer() Dim html = Await (New StreamReader(req.Body)).ReadToEndAsync() Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html) Return New FileContentResult(pdf.BinaryData, "application/pdf") End Function End Module $vbLabelText $csharpLabel 谷歌云平台 // AWS Lambda configuration // Use custom runtime or container deployment // Ensure Lambda has at least 512MB memory public class PdfLambdaFunction { private readonly ChromePdfRenderer _renderer; public PdfLambdaFunction() { _renderer = new ChromePdfRenderer(); // Configure for Lambda environment IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled; } public async Task<APIGatewayProxyResponse> FunctionHandler( APIGatewayProxyRequest request, ILambdaContext context) { var pdf = await _renderer.RenderHtmlAsPdfAsync(request.Body); return new APIGatewayProxyResponse { StatusCode = 200, Headers = new Dictionary<string, string> { { "Content-Type", "application/pdf" } }, Body = Convert.ToBase64String(pdf.BinaryData), IsBase64Encoded = true }; } } // AWS Lambda configuration // Use custom runtime or container deployment // Ensure Lambda has at least 512MB memory public class PdfLambdaFunction { private readonly ChromePdfRenderer _renderer; public PdfLambdaFunction() { _renderer = new ChromePdfRenderer(); // Configure for Lambda environment IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled; } public async Task<APIGatewayProxyResponse> FunctionHandler( APIGatewayProxyRequest request, ILambdaContext context) { var pdf = await _renderer.RenderHtmlAsPdfAsync(request.Body); return new APIGatewayProxyResponse { StatusCode = 200, Headers = new Dictionary<string, string> { { "Content-Type", "application/pdf" } }, Body = Convert.ToBase64String(pdf.BinaryData), IsBase64Encoded = true }; } } ' AWS Lambda configuration ' Use custom runtime or container deployment ' Ensure Lambda has at least 512MB memory Public Class PdfLambdaFunction Private ReadOnly _renderer As ChromePdfRenderer Public Sub New() _renderer = New ChromePdfRenderer() ' Configure for Lambda environment IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled End Sub Public Async Function FunctionHandler(ByVal request As APIGatewayProxyRequest, ByVal context As ILambdaContext) As Task(Of APIGatewayProxyResponse) Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(request.Body) Return New APIGatewayProxyResponse With { .StatusCode = 200, .Headers = New Dictionary(Of String, String) From { {"Content-Type", "application/pdf"} }, .Body = Convert.ToBase64String(pdf.BinaryData), .IsBase64Encoded = True } End Function End Class $vbLabelText $csharpLabel 容器部署(Docker/Kubernetes) # app.yaml for App Engine runtime: aspnetcore env: flex # Use 2nd generation for Cloud Run # Deploy with: gcloud run deploy --execution-environment gen2 # app.yaml for App Engine runtime: aspnetcore env: flex # Use 2nd generation for Cloud Run # Deploy with: gcloud run deploy --execution-environment gen2 YAML IronPDF 是容器准备好的,支持完整的Docker 和 Kubernetes: 桌面应用支持 # Multi-stage Dockerfile for optimal size FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["YourApp.csproj", "./"] RUN dotnet restore COPY . . RUN dotnet publish -c Release -o /app/publish FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app # InstallIronPDFdependencies RUN apt-get update && apt-get install -y \ libglib2.0-0 libnss3 libatk1.0-0 libatk-bridge2.0-0 \ libcups2 libxkbcommon0 libxcomposite1 libxdamage1 \ libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 COPY --from=build /app/publish . ENTRYPOINT ["dotnet", "YourApp.dll"] IronPDF 兼容所有主要的 .NET 桌面框架: WPF(Windows Presentation Foundation) Windows 窗体 public partial class MainWindow : Window { private async void GeneratePdfButton_Click(object sender, RoutedEventArgs e) { var renderer = new ChromePdfRenderer(); var html = HtmlEditor.Text; var pdf = await renderer.RenderHtmlAsPdfAsync(html); var saveDialog = new SaveFileDialog { Filter = "PDF files (*.pdf)|*.pdf", DefaultExt = "pdf" }; if (saveDialog.ShowDialog() == true) { pdf.SaveAs(saveDialog.FileName); MessageBox.Show("PDF saved successfully!"); } } } public partial class MainWindow : Window { private async void GeneratePdfButton_Click(object sender, RoutedEventArgs e) { var renderer = new ChromePdfRenderer(); var html = HtmlEditor.Text; var pdf = await renderer.RenderHtmlAsPdfAsync(html); var saveDialog = new SaveFileDialog { Filter = "PDF files (*.pdf)|*.pdf", DefaultExt = "pdf" }; if (saveDialog.ShowDialog() == true) { pdf.SaveAs(saveDialog.FileName); MessageBox.Show("PDF saved successfully!"); } } } Partial Public Class MainWindow Inherits Window Private Async Sub GeneratePdfButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim renderer = New ChromePdfRenderer() Dim html = HtmlEditor.Text Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html) Dim saveDialog = New SaveFileDialog With { .Filter = "PDF files (*.pdf)|*.pdf", .DefaultExt = "pdf" } If saveDialog.ShowDialog() = True Then pdf.SaveAs(saveDialog.FileName) MessageBox.Show("PDF saved successfully!") End If End Sub End Class $vbLabelText $csharpLabel MAUI(多平台应用 UI) public partial class PdfGeneratorForm : Form { private void btnGeneratePdf_Click(object sender, EventArgs e) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(txtHtml.Text); using (var saveDialog = new SaveFileDialog()) { saveDialog.Filter = "PDF files|*.pdf"; if (saveDialog.ShowDialog() == DialogResult.OK) { pdf.SaveAs(saveDialog.FileName); MessageBox.Show($"PDF saved to {saveDialog.FileName}"); } } } } public partial class PdfGeneratorForm : Form { private void btnGeneratePdf_Click(object sender, EventArgs e) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(txtHtml.Text); using (var saveDialog = new SaveFileDialog()) { saveDialog.Filter = "PDF files|*.pdf"; if (saveDialog.ShowDialog() == DialogResult.OK) { pdf.SaveAs(saveDialog.FileName); MessageBox.Show($"PDF saved to {saveDialog.FileName}"); } } } } Partial Public Class PdfGeneratorForm Inherits Form Private Sub btnGeneratePdf_Click(ByVal sender As Object, ByVal e As EventArgs) Dim renderer = New ChromePdfRenderer() Dim pdf = renderer.RenderHtmlAsPdf(txtHtml.Text) Using saveDialog = New SaveFileDialog() saveDialog.Filter = "PDF files|*.pdf" If saveDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then pdf.SaveAs(saveDialog.FileName) MessageBox.Show($"PDF saved to {saveDialog.FileName}") End If End Using End Sub End Class $vbLabelText $csharpLabel 开始使用 PDF 创建 public partial class MainPage : ContentPage { public async Task GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync(HtmlContent); // Save to app's document directory var documentsPath = FileSystem.Current.AppDataDirectory; var filePath = Path.Combine(documentsPath, "output.pdf"); await File.WriteAllBytesAsync(filePath, pdf.BinaryData); await DisplayAlert("Success", $"PDF saved to {filePath}", "OK"); } } public partial class MainPage : ContentPage { public async Task GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync(HtmlContent); // Save to app's document directory var documentsPath = FileSystem.Current.AppDataDirectory; var filePath = Path.Combine(documentsPath, "output.pdf"); await File.WriteAllBytesAsync(filePath, pdf.BinaryData); await DisplayAlert("Success", $"PDF saved to {filePath}", "OK"); } } Partial Public Class MainPage Inherits ContentPage Public Async Function GeneratePdfAsync() As Task Dim renderer = New ChromePdfRenderer() Dim pdf = Await renderer.RenderHtmlAsPdfAsync(HtmlContent) ' Save to app's document directory Dim documentsPath = FileSystem.Current.AppDataDirectory Dim filePath = Path.Combine(documentsPath, "output.pdf") Await File.WriteAllBytesAsync(filePath, pdf.BinaryData) Await DisplayAlert("Success", $"PDF saved to {filePath}", "OK") End Function End Class $vbLabelText $csharpLabel 准备在您的 C# 应用程序中开始创建 PDF 吗? 按照这个分步指南,从安装到您的第一个生成的 PDF。IronPDF使得开始变得简单,每一步都有全面的资源和支持可供使用。 ### 步骤 1:安装 IronPDF 选择最适合您的开发环境的安装方法: Visual Studio 包管理器**(推荐) 在 Visual Studio 中打开项目 在解决方案资源管理器中右键单击项目 选择“管理 NuGet 包” Select "Manage NuGet Packages" Search for "IronPDF" Click Install on the IronPdf package by Iron Software Package Manager Console** Install-Package IronPdf .NET CLI dotnet add package IronPdf The NuGet package includes everything needed for PDF generation on Windows, Linux, and macOS. For specialized deployments, consider these platform-specific packages that optimize size and performance: IronPdf.Linux - Optimized for Linux environments IronPdf.MacOs - Native Apple Silicon support IronPdf.Slim - Minimal package that downloads dependencies at runtime Step 2: Create Your First PDF Start with a simple example to verify everything is working: using IronPdf; class Program { static void Main() { // Create a new PDF generator instance var renderer = new ChromePdfRenderer(); // Generate PDF from HTML var pdf = renderer.RenderHtmlAsPdf(@" <h1>Welcome to IronPDF!</h1> <p>This is your first generated PDF document.</p> <p>Created on: " + DateTime.Now + "</p>" ); // Save the PDF pdf.SaveAs("my-first-pdf.pdf"); Console.WriteLine("PDF created successfully!"); } } using IronPdf; class Program { static void Main() { // Create a new PDF generator instance var renderer = new ChromePdfRenderer(); // Generate PDF from HTML var pdf = renderer.RenderHtmlAsPdf(@" <h1>Welcome to IronPDF!</h1> <p>This is your first generated PDF document.</p> <p>Created on: " + DateTime.Now + "</p>" ); // Save the PDF pdf.SaveAs("my-first-pdf.pdf"); Console.WriteLine("PDF created successfully!"); } } Imports IronPdf Friend Class Program Shared Sub Main() ' Create a new PDF generator instance Dim renderer = New ChromePdfRenderer() ' Generate PDF from HTML Dim pdf = renderer.RenderHtmlAsPdf(" <h1>Welcome to IronPDF!</h1> <p>This is your first generated PDF document.</p> <p>Created on: " & DateTime.Now & "</p>") ' Save the PDF pdf.SaveAs("my-first-pdf.pdf") Console.WriteLine("PDF created successfully!") End Sub End Class $vbLabelText $csharpLabel Step 3: Explore Examples and Tutorials IronPDF provides extensive resources to help you master PDF generation: Code Examples - Ready-to-use code snippets for common scenarios Tutorials - Step-by-step guides for specific features How-To Guides - Practical solutions to real-world problems API Reference - Comprehensive documentation of all classes and methods Step 4: Get Help When Needed IronPDF offers multiple support channels to ensure your success: 24/7 Live Chat Support - Chat with engineers in real-time for immediate assistance Email Support - Get detailed responses to complex questions Stack Overflow - Community support and solutions Step 5: Development and Deployment Free Development License IronPDF is free for development and testing. You can explore all features without any limitations during development. Watermarks appear on generated PDFs in development mode but don't affect functionality. Production Deployment Options When you're ready to deploy to production,IronPDFoffers flexible licensing: Free Trial - Get a 30-day trial license to test in production without watermarks Commercial Licenses - Starting at $799 for single-project deployment Enterprise Solutions - Custom packages for large organizations To apply a license in your code: IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY" $vbLabelText $csharpLabel Step 6: Stay Updated Keep your PDF generation capabilities current: Subscribe to Updates - Get notified about new features and improvements Follow the Blog - Learn about best practices and new techniques Check the Changelog - See what's new in each release Regular updates ensure compatibility with the latest .NET versions and include performance improvements, new features, and security updates. Why ChooseIronPDFfor PDF Generation in C#? After exploring various approaches to create PDFs in C#, you might wonder what makesIronPDFthe preferred choice for many developers. It's not just about features - it's about the entire developer experience, from initial implementation to long-term maintenance when you need to generate PDFs in .NET. With over 14 million developers usingIronPDFglobally as their C# PDF generator, it has become the de facto standard for PDF generation in .NET applications. Let's examine why developers chooseIronPDFfor their PDF creation in C# needs. Pixel-Perfect Rendering Unlike other PDF libraries that produce approximations of your HTML designs,IronPDFuses a real Chromium engine to ensure your PDFs look exactly like they would in a modern web browser. This pixel-perfect rendering capability is why financial institutions trustIronPDFto generate regulatory reports where precision matters. Your CSS Grid layouts, flexbox designs, and JavaScript-rendered content all work perfectly. 否 more fighting with proprietary layout engines or accepting "close enough" results when you create PDF documents. Developer-Friendly API IronPDF's API is designed by developers, for developers. The simplicity of the API is why startups can get their PDF generation working in hours, not days. Instead of learning complex PDF specifications, you work with familiar concepts: using IronPdf; // Other libraries might require this: // document.Add(new Paragraph("Hello World")); // document.Add(new Table(3, 2)); // cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY); // With IronPDF, just use HTML: var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(@" <h1>Hello World</h1> <table> <tr style='background: lightgray;'> <td>Simple</td> <td>Intuitive</td> </tr> </table> "); using IronPdf; // Other libraries might require this: // document.Add(new Paragraph("Hello World")); // document.Add(new Table(3, 2)); // cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY); // With IronPDF, just use HTML: var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(@" <h1>Hello World</h1> <table> <tr style='background: lightgray;'> <td>Simple</td> <td>Intuitive</td> </tr> </table> "); Imports IronPdf ' Other libraries might require this: ' document.Add(new Paragraph("Hello World")); ' document.Add(new Table(3, 2)); ' cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY); ' With IronPDF, just use HTML: Private renderer = New ChromePdfRenderer() Private pdf = renderer.RenderHtmlAsPdf(" <h1>Hello World</h1> <table> <tr style='background: lightgray;'> <td>Simple</td> <td>Intuitive</td> </tr> </table> ") $vbLabelText $csharpLabel Enterprise-Ready Features IronPDF includes features that enterprise applications demand, which is why Fortune 500 companies rely on it for mission-critical document generation: Security: Encryption, digital signatures, and permission controls protect sensitive documents Compliance: PDF/A and PDF/UA support ensures your generated PDFs meet regulatory requirements Performance: Async operations and batch processing handle millions of documents efficiently Reliability: Extensive error handling and logging help maintain uptime in production Outstanding Support When you need help, IronPDF's support team consists of actual engineers who understand your challenges. With 24/7 live chat support and typical response times under 30 seconds, you're never stuck waiting for answers. This level of support is why developers consistently rateIronPDFas having the best support in the industry. The support team can help with everything from basic questions to complex implementation challenges, ensuring your PDF generation projects succeed. Transparent Pricing No hidden fees, no surprise costs, no per-server licensing complications. IronPDF's straightforward licensing model means you know exactly what you're paying for. Development is always free, and production licenses are perpetual - you own them forever. This transparency is refreshing in an industry known for complex licensing schemes. Active Development IronPDF is continuously improved with monthly updates that add features, enhance performance, and ensure compatibility with the latest .NET releases. The team actively monitors customer feedback and implements requested features regularly. Recent additions include enhanced form handling, improved PDF editing capabilities, and optimizations for cloud deployments. Real-World Success Stories Thousands of companies across industries trustIronPDFfor mission-critical PDF generation: Finance: Banks generate millions of statements and reports monthly using IronPDF's secure document features Healthcare: Hospitals create patient records and lab results with HIPAA-compliant security settings E-commerce: Online retailers produce invoices and shipping labels at scale, handling peak loads effortlessly Government: Agencies generate official documents and forms with digital signatures and encryption These organizations chooseIronPDFbecause it delivers consistent results at scale - whether generating a single invoice or processing millions of documents daily. How DoesIronPDFCompare to Other C# PDF Libraries? Choosing the right PDF library is crucial for your project's success when you need to generate PDFs in C#. Let's look at howIronPDFcompares to other popular options in the .NET ecosystem for PDF creation. This comparison is based on real-world usage, developer feedback, and technical capabilities for those looking to build PDFs in .NET. Understanding these differences helps you choose the best C# PDF generator for your specific needs. Comparison Table Feature IronPDF wkhtmltopdf QuestPDF iText 7 PdfSharp Syncfusion Aspose.PDF HTML to PDF Quality Pixel-Perfect Print-Style N/A Limited 否 HTML Good Good HTML5/CSS3 Support Full Outdated Code-Only Partial 无 Full Full JavaScript Support Full 否 否 Limited 否 Limited Limited 易用性 3 Lines CLI Only Code-First Complex Low-Level Good Complex Server Dependencies 无 Executable 无 无 无 无 无 Performance Fast + Async Slow Fast Fast Fast Fast Fast Active Development Very Active Abandoned Active Active Minimal Active Active License Type Commercial Open Source MIT→Commercial* AGPL/Commercial MIT Commercial Commercial Starting Price $799 Free $599+* $2,399+ Free $2,995+ $2,499+ *Note: QuestPDF recently changed from MIT to commercial licensing Detailed Comparisons IronPDFvs wkhtmltopdf -wkhtmltopdfis free but was abandoned in 2020 and produces dated-looking PDFs Requires platform-specific executables that complicate deployment 否 JavaScript support means modern web apps won't render correctly -IronPDFoffers modern rendering with no external dependencies IronPDFvs QuestPDF QuestPDF requires building PDFs entirely in C# code with no HTML support Good for programmatic PDF creation but time-consuming for complex layouts Recently switched from MIT to commercial licensing -IronPDFlets you use HTML/CSS skills you already have IronPDFvs iText 7 iText has AGPL licensing that can "infect" your codebase Commercial licenses start at $1,999 with complex pricing Limited HTML to PDF capabilities with poor CSS support -IronPDFprovides superior HTML rendering at a lower price point IronPDFvs PdfSharp PdfSharp is great for low-level PDF manipulation but has zero HTML support Requires manually positioning every element on the page Free and open source but very limited in features -IronPDFhandles both high-level HTML and low-level PDF operations IronPDFvs Syncfusion/Aspose.PDF Both are enterprise options with good features but higher pricing Syncfusion starts at $2,995, Aspose at $2,499 Neither achieves the same pixel-perfect HTML rendering as IronPDF -IronPDFoffers better value with comparable enterprise features Migration Paths Many developers switch toIronPDFfrom other libraries. 原因如下: From wkhtmltopdf "We were tired of dealing with platform-specific binaries and outdated rendering" "IronPDF gave us modern CSS support and eliminated our Docker headaches" From iTextSharp/iText 7 "The learning curve was killing our productivity -IronPDFlet us use HTML instead" "AGPL licensing was a deal-breaker for our commercial product" From PdfSharp "We needed HTML to PDF conversion, which PdfSharp simply doesn't do" "Manually positioning every element was taking forever" From QuestPDF "Building layouts in C# code was tedious compared to using HTML/CSS" "The recent license change made us reconsider our options" 结论 Creating PDFs in C# doesn't have to be complicated. With IronPDF, you can generate professional PDF documents using the HTML and CSS skills you already have. Whether you're building simple reports or complex documents with charts and forms,IronPDFhandles the heavy lifting so you can focus on your application logic. Join the 14 million developers worldwide who trustIronPDFas their C# PDF generator to produce PDFs reliably and efficiently. Throughout this guide, we've explored how to create PDF documents using multiple approaches - from HTML strings and URLs to converting existing files like Word documents and Markdown. We've seen how IronPDF's modern Chromium-based rendering engine produces pixel-perfect results that actually look like your web designs, not dated printer output. The ability to manipulate PDF documents programmatically, add security features, and optimize performance makesIronPDFa complete solution for all your PDF generation tasks in .NET. What setsIronPDFapart is its developer-first approach. With just three lines of code, you can generate your first PDF. The intuitive API means you spend less time learning proprietary PDF syntax and more time building features. Combined with excellent support from real engineers, transparent pricing, and continuous updates (including pre-release support for .NET 10),IronPDFgives you confidence that your PDF creation in C# will work today and in the future. Start creating PDFs today - get your free trial license and see how easy PDF generation in .NET can be in your applications. With IronPDF, you'll be generating professional PDFs in minutes, not hours. Ready to build your first PDF? Get started with IronPDF - it's free for development, and you'll be creating PDFs with C# in minutes. 请注意Aspose, iText, wkhtmltopdf, QuestPDF, PdfSharp and SyncFusion are registered trademarks of their respective owners. This site is not affiliated with, endorsed by, or sponsored by Aspose, iText, wkhtmltopdf, QuestPDF, PdfSharp, or SyncFusion. 比较是基于写作时的公开信息,仅提供用于信息目的。)}] Comparisons are provided for informational purposes only and are based on publicly available information at the time of writing. 常见问题解答 我如何在 C# 中从 HTML 内容创建 PDF? 您可以使用 IronPDF 的 RenderHtmlAsPdf 方法在 C# 中从 HTML 内容创建 PDF。这允许您轻松将 HTML 字符串或 URL 直接转换为 PDF 文档。 使用商业 PDF 库比免费库有什么优势? 像 IronPDF 这样的商业 PDF 库提供强大的功能,例如全面支持 JavaScript、CSS3 和响应式布局。它们提供可靠的性能、定期更新、全面的支持,并针对创建高质量 PDF 进行了优化。 IronPDF 可以用于在 ASP.NET MVC 应用程序中生成 PDF 吗? 是的,IronPDF 可以用于 ASP.NET MVC 应用程序中,将 Razor 视图或 HTML 模板转换为 PDF,让您可以无缝集成 PDF 生成功能到 Web 应用程序中。 如何使用 C# 将图像和 CSS 集成到 PDF 文档中? 使用 IronPDF,您可以轻松将图像和 CSS 集成到 PDF 文档中。这可以通过在转换为 PDF 之前在 HTML 内容中包含图像标签和 CSS 样式来实现。 是否可以在 C# 中向 PDF 添加页眉、页脚和页码? 是的,IronPDF 提供高级功能,允许您向 PDF 文档添加页眉、页脚和页码。这可以通过在渲染 HTML 内容之前配置 PDF 设置来完成。 在生成 PDF 时如何处理 C# 中的 XML 数据? 使用 IronPDF,您可以通过将 XML 转换为 HTML 或使用 XSLT 样式化 XML,然后使用 IronPDF 的 RenderHtmlAsPdf 方法将其转换为 PDF 文档来处理 XML 数据。 在 C# 中生成 PDF 的常见挑战是什么? 常见的挑战包括保持布局一致性、处理复杂的 CSS 和 JavaScript,以及确保准确渲染 Web 技术。IronPDF 通过其现代的 Chromium 引擎和对 HTML5 和 CSS3 标准的广泛支持解决了这些挑战。 如何使用 C# 高效生成大型 PDF? IronPDF 设计用于高效处理大型 PDF 生成。它使用高性能渲染引擎并支持异步操作,以轻松管理大型文档。 我可以在没有商业许可证的情况下测试 IronPDF 吗? 是的,IronPDF 提供一个免费的开发和测试许可证,允许您在购买生产用途的商业许可证之前评估其功能。 .NET 10 兼容性:我可以在 .NET 10 中使用 IronPDF 吗?有什么特殊注意事项吗? 是的,IronPDF 完全兼容 .NET 10。它开箱即用,支持包括面向 Windows、Linux、容器化环境和 Web 框架的项目在内的所有 .NET 10 环境。无需任何特殊配置——只需安装最新的 IronPDF NuGet 包,即可与 .NET 10 无缝协作。 Jacob Mellor 立即与工程团队聊天 首席技术官 Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。他的旗舰 IronPDF 和 IronSuite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。 相关文章 已发布十一月 13, 2025 如何在 C# 中合并两个 PDF 字节数组 使用 IronPDF 在 C# 中合并两个 PDF 字节数组。学习通过简单的代码示例从字节数组、内存流和数据库合并多个 PDF 文件。 阅读更多 已发布十一月 13, 2025 如何创建 ASP.NET MVC PDF 查看器 为 ASP.NET MVC 应用程序构建一个强大的 PDF 查看器。显示 PDF 文档,将视图转换为 PDF,并使用 IronPDF 添加交互功能。 阅读更多 已发布十一月 13, 2025 如何构建 .NET HTML 到 PDF 转换器 学习如何使用 IronPDF 在 .NET 中将 HTML 转换为 PDF。 阅读更多 .NET Core PDF库x509certificate2以编程方式在P...
已发布十一月 13, 2025 如何在 C# 中合并两个 PDF 字节数组 使用 IronPDF 在 C# 中合并两个 PDF 字节数组。学习通过简单的代码示例从字节数组、内存流和数据库合并多个 PDF 文件。 阅读更多
已发布十一月 13, 2025 如何创建 ASP.NET MVC PDF 查看器 为 ASP.NET MVC 应用程序构建一个强大的 PDF 查看器。显示 PDF 文档,将视图转换为 PDF,并使用 IronPDF 添加交互功能。 阅读更多