产品比较 Report .NET和IronPDF之间比较 Curtis Chau 已更新:八月 20, 2025 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在双子座打开 向 Gemini 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 在本文中,我们将深入探讨两个流行的C#库,用于处理PDF文件:IronPDF - 针对C#开发人员的.NET PDF库 和Report.NET。 对于需要通过其C#应用程序创建、修改或与PDF文档交互的开发人员来说,这些工具是必不可少的。 这两个库提供了一系列功能,旨在让处理PDF变得更容易和更高效,但它们以不同的方式实现这一目标。 IronPDF和Report.NET使开发人员能够动态生成文档、编辑内容以及从PDF中提取文本和图像。 它们还支持表单处理、添加数字签名,并确保应用程序可以跨不同平台处理PDF而不会丢失文档保真度。 这意味着无论是设备还是操作系统,PDF都将按预期显示和运行。 在整个比较中,我们将深入研究每个库提供的具体功能,它们如何工作,提供代码片段以说明它们如何使用,并讨论它们的许可条款。 此比较旨在使开发人员清楚了解每个库可以做什么,从而帮助他们决定哪个可能最适合项目需求。 让我们分解IronPDF和Report.NET之间的功能和区别,特别关注开发人员的简便性和实用见解。 1. Report.NET C#库 Report.NET 是一个强大的C#库,旨在帮助开发人员直接在他们的.NET应用程序中创建、管理和操作PDF文档。 该工具以其简单明了的PDF生成和操作方法而闻名,可以从头开始创建复杂的PDF文档或修改现有的文档。 其功能范围从简单的文本添加到图像和形状的嵌入,使其成为开发人员在项目中实现PDF功能的多用途选择。 1.1 Report.NET的主要特征 1.1.1 文档的创建和编辑 Report.NET在创建新的PDF文档和编辑现有的文档方面表现突出。 开发人员可以轻松添加文本、图像和图形,从而可以生产出详细且视觉上吸引人的文档。 1.1.2 内容管理的灵活性 该库允许对文档内容进行精确控制,包括文本格式化、图像放置和图形元素。 这种控制水平确保最终的PDF看起来如预期一样。 1.1.3 易于使用 Report.NET注重简便,使PDF生成过程简单化,即使是对PDF编程不熟悉的用户也可以轻松使用。 1.1.4 平台兼容性 Report.NET设计用于在.NET平台(包括.NET Core)上无缝工作,确保应用程序无论在什么操作系统上都可以生成和管理PDF。 1.1.5 定制和样式 该库提供了广泛的PDF文档自定义选项,允许开发人员根据具体需求调整布局、样式和整体外观。 1.1.6 开源 作为一个开源工具,Report.NET受益于社区贡献,确保其得到最新维护并随着时间推移获得新功能。这种社区支持还意味着开发人员可以访问大量知识和资源。 2. IronPDF C#库 IronPDF 是一个综合的.NET库,设计用于在.NET应用程序内创建、操作和呈现PDF文档。 该工具以其能够从HTML生成PDF及直接编辑现有PDF文件的能力而脱颖而出。 它在创建报告方面非常有帮助。 IronPDF还可以与SQL Server Reporting Services无缝集成。 我们可以与IronPDF创建一个终端用户报告设计器,用于创建报告工具和报告查看器。 2.1 IronPDF的主要功能 2.1.1 HTML 转 PDF 转换 IronPDF的核心优势之一是能够将HTML和CSS转换为PDF文档。 该功能对需要将网络内容转换为可移植格式的开发人员非常有价值,同时保留了原始设计和布局。 2.1.2 PDF 操作 IronPDF在为开发人员提供编辑和操作PDF文档工具方面表现出色。 这包括添加或删除页面、修改文本和嵌入图像。 我们还可以使用IronPDF从报告中提取报告数据。 2.1.3 表单处理 该库支持PDF表单的创建和编辑,使用户能够以动态方式与文档互动。 这一功能对于需要终端用户输入的应用程序(如调查或申请表)非常重要。 2.1.4 安全功能 使用IronPDF,可以轻松实现加密和密码保护等安全措施。 这些功能确保PDF文档中的敏感信息免受未经授权的访问。 2.1.5 打印与渲染 IronPDF允许开发者将PDF渲染以便进行屏幕查看和纸张打印,确保高质量的输出。 这样可以更容易地为各种展示或分发需求准备文件。 2.1.6 跨平台支持 IronPDF可在各种.NET平台上运行,遵循.NET代码标准,并能在多样的环境中开发而不会出现兼容性问题。 2.1.7 全面的文档与支持 IronPDF借助详尽的文档和专门的支持,帮助开发人员高效地导航库的功能并将其集成到应用程序中。 2.1.8 高级PDF编辑 IronPDF提供多项高级编辑功能。 这包括合并和拆分PDF文档的能力,对组织大量信息或提取文档中的特定部分以供独立使用特别有用。 2.1.9 自定义页眉和页脚 该库允许PDF文档内的页眉和页脚的自定义。 这项功能对于在页面之间添加一致的品牌标识、页码或文档标题至关重要,使输出的专业外观得到提升。 3. 在Visual Studio中创建控制台项目 在Visual Studio IDE中创建控制台应用程序是一个涉及几个步骤的简单过程。 3.1 启动 Visual Studio 首先打开微软Visual Studio。 如果你没有安装它,你需要从 微软官方网页下载并安装它。 安装完后,启动Visual Studio。 3.2 创建新项目 打开Visual Studio后,你将看到起始窗口。 在这里,选择"创建一个新项目"选项以开始设置新控制台应用程序的过程。 3.3 选择项目类型 在"创建一个新项目"窗口中,您会看到各种项目模板。 在搜索框中键入"console"以过滤选项,然后从列表中选择"Console App"。确保选择与你将使用的编程语言相对应的模板,如 C#。 3.4 配置项目 选择控制台应用程序模板后,点击"下一步"继续项目配置界面。 在这里,您需要提供一些有关您项目的详细信息: 项目名称:赋予项目一个能反映其目的的名称。 位置:选择要将项目文件保存在计算机上的位置。 * 解决方案名称:默认情况下,它与项目名称相同,但如果您计划在同一解决方案中包括多个项目,您可以更改它。 解决方案名称: 默认情况下,这与您的项目名称相同,但如果您计划在同一解决方案中包含多个项目,可以更改它。 框架: 选择您想要针对的 .NET Framework 版本。 3.5 创建项目 这一过程可能需要一些时间。 Visual Studio 现在将根据您的规范生成一个新的控制台应用程序项目。 要在项目中利用IronPDF 的功能,首先需要安装该库。有多种方法可以实现,每种方法适合不同的开发工作流程或偏好。 4. 安装 IronPDF 库 要在您的项目中利用 IronPDF 的功能,您需要先安装该库。可以通过几种方法来完成此操作,每种方法都适应不同的开发工作流程或偏好。 下面是将 IronPDF 库安装到 Visual Studio 项目中的三种常见方法。 在Visual Studio中,导航到解决方案资源管理器中的项目,右键单击它并选择"管理NuGet包..."选项。 Visual Studio 中的 NuGet 包管理器 UI 提供了一种直接的方式来浏览、选择和安装包。 在 Visual Studio 中,导航到解决方案资源管理器中的项目,右键单击它,然后选择 "管理 NuGet 包..." 选项。 点击 "浏览" 标签,输入 "IronPDF" 到搜索框中。 在搜索结果中找到 IronPDF 包,选择它,然后点击 "安装" 按钮。 Visual Studio 将自动处理下载和安装。 4.2 使用 NuGet 包管理器控制台安装 对于那些喜欢使用命令行工具的人,NuGet 包管理器控制台是一个强大的替代方案。 打开控制台: 转到 Visual Studio 中的 "工具" 菜单,然后导航到 "NuGet 包管理器" > "包管理器控制台"。 4.3 使用NuGet网站安装 Install-Package IronPdf 如果您偏好手动下载包或需要IronPDF的特定版本,NuGet网站是一个不错的选择。 访问NuGet网站: 前往nuget.org并搜索"IronPDF"。 下载包: 在IronPDF 页中,选择您需要的版本并下载.nupkg文件。 手动安装: 下载完成后,您可以手动将该包添加到项目中。 下载软件包:从 IronPDF 页面,选择所需的版本并下载 .nupkg 文件。 手动安装: 下载后,您可以手动将包添加到您的项目中。 在 Visual Studio 中,转到 "工具" 菜单,然后选择 "选项" > "NuGet 包管理器" > "包源"。 添加一个新的源,指向您下载 .nupkg 文件的文件夹。最后,使用 Visual Studio 中的包管理器 UI 或控制台从本地源安装包。 5. 安装 Report.NET 库 打开您的网页浏览器,前往 Report.NET GitHub 仓库 https://github.com/ritchiecarroll/Report.NET/tree/master。 此页面包含最新版本的 Report.NET 库及其源代码。 5.1 下载库 在仓库页面上,找到 "代码" 按钮并点击。 在下拉菜单中,选择 "下载 ZIP" 以下载整个仓库作为 ZIP 文件。将此文件保存到计算机上的方便位置并提取其内容。 5.2 将 Report.NET 添加到您的项目中 解压缩 ZIP 文件后,您会在解压后的文件中找到 Report.NET 库的源代码。 要在您的 Visual Studio 项目中使用 Report.NET,请按照以下步骤操作: 打开您的项目: 启动 Visual Studio,并打开您希望添加 Report.NET 的项目。 手动添加库: 有几种方法可以将该库包含到您的项目中: 作为编译的程序集: 如果 GitHub 仓库包含已编译的 DLL 文件,您可以直接在项目中添加对该 DLL 的引用。 右键单击项目解决方案资源管理器中的 "References",选择 "Add Reference...",然后浏览并选择 DLL 文件。 通过包括源文件: 如果您希望直接包含源代码,或者未提供已编译的 DLL,您可以将源代码文件添加到您的项目中。 在解决方案资源管理器中右键单击您的项目,选择 "Add" > "Existing Item...",然后导航并选择您从 ZIP 文件中提取的 Report.NET 源代码文件。 确保兼容性: 请确保您的项目使用与 Report.NET 要求的兼容 .NET Framework 版本。 6. IronPDF 与 Report.NET 的高级功能 C 6.1 IronPDF 的高级功能 C IronPDF 提供了一套高级功能,旨在轻松处理范围广泛的 PDF 相关任务。 6.1.1 HTML 转 PDF 渲染 IronPDF 可以直接将 HTML 内容(包括 CSS 和 JavaScript)渲染成 PDF 文档。 这意味着网页或 HTML 模板可以被转换为在浏览器中显示一致的 PDF 文件。 6.1.1.1 HTML 字符串转 PDF IronPDF 允许直接将 HTML 字符串转为 PDF。 这意味着开发者可以将存储为字符串变量的 HTML 代码使用 IronPDF 渲染成 PDF 文件。此功能在 HTML 内容由应用程序动态生成或修改后进行转换时特别有用。 using IronPdf; var Renderer = new IronPdf.HtmlToPdf(); var PDF = Renderer.RenderHtmlAsPdf("<h1>Hello IronPDF</h1>"); PDF.SaveAs("HtmlStringToPdf.pdf"); using IronPdf; var Renderer = new IronPdf.HtmlToPdf(); var PDF = Renderer.RenderHtmlAsPdf("<h1>Hello IronPDF</h1>"); PDF.SaveAs("HtmlStringToPdf.pdf"); Imports IronPdf Private Renderer = New IronPdf.HtmlToPdf() Private PDF = Renderer.RenderHtmlAsPdf("<h1>Hello IronPDF</h1>") PDF.SaveAs("HtmlStringToPdf.pdf") $vbLabelText $csharpLabel 这是通过从文件系统中读取HTML文件并使用IronPDF创建具有相同格式和结构的PDF文档来实现的。 这通过从文件系统读取 HTML 文件,使用 IronPDF 创建具有相同格式和结构的 PDF 文档来实现。 using IronPdf; var Renderer = new ChromePdfRenderer(); var PDF = Renderer.RenderHTMLFileAsPdf("invoice.html"); PDF.SaveAs("HtmlFileToPdf.pdf"); using IronPdf; var Renderer = new ChromePdfRenderer(); var PDF = Renderer.RenderHTMLFileAsPdf("invoice.html"); PDF.SaveAs("HtmlFileToPdf.pdf"); Imports IronPdf Private Renderer = New ChromePdfRenderer() Private PDF = Renderer.RenderHTMLFileAsPdf("invoice.html") PDF.SaveAs("HtmlFileToPdf.pdf") $vbLabelText $csharpLabel 6.1.1.3 URL 转 PDF IronPDF 还能够从一个实时 URL 渲染 PDF。 这允许开发者输入一个网址,IronPDF 将从该 URL 获取 HTML 内容并将其渲染为 PDF。 using IronPdf; var Renderer = new ChromePdfRenderer(); var PDF = Renderer.RenderUrlAsPdf("http://ironpdf.com"); PDF.SaveAs("UrlToPdf.pdf"); using IronPdf; var Renderer = new ChromePdfRenderer(); var PDF = Renderer.RenderUrlAsPdf("http://ironpdf.com"); PDF.SaveAs("UrlToPdf.pdf"); Imports IronPdf Private Renderer = New ChromePdfRenderer() Private PDF = Renderer.RenderUrlAsPdf("http://ironpdf.com") PDF.SaveAs("UrlToPdf.pdf") $vbLabelText $csharpLabel 6.1.2 编辑 PDF 使用 IronPDF,您可以 编辑现有 PDF 文档。 这包括添加文本、图像和页面或从文档中删除页面。 您还可以 查找并替换 PDF 文档中的文本。 using IronPdf; var document = PdfDocument.FromFile("original_document.pdf"); const int targetPageIndex = 1; const string oldString = "Hello, World!"; const string newString = "Greetings, Universe!"; document.ReplaceTextOnPage(targetPageIndex, oldString, newString); document.SaveAs("modified_document.pdf"); using IronPdf; var document = PdfDocument.FromFile("original_document.pdf"); const int targetPageIndex = 1; const string oldString = "Hello, World!"; const string newString = "Greetings, Universe!"; document.ReplaceTextOnPage(targetPageIndex, oldString, newString); document.SaveAs("modified_document.pdf"); Imports IronPdf Private document = PdfDocument.FromFile("original_document.pdf") Private Const targetPageIndex As Integer = 1 Private Const oldString As String = "Hello, World!" Private Const newString As String = "Greetings, Universe!" document.ReplaceTextOnPage(targetPageIndex, oldString, newString) document.SaveAs("modified_document.pdf") $vbLabelText $csharpLabel 6.1.3 提取文本和图像 该库可以 从 PDF 文件中提取文本和图像,类似于 Crystal Reports,您可以用于索引、搜索或重新利用内容。 6.1.4 生成 PDF 表单 IronPDF 支持创建 PDF 表单。 开发人员可以通过编程在 PDF 中创建表单,用户可以填写它们。 using IronPdf; using System; const string alternativeHtmlContent = @" <html> <body> <h2>Alternative PDF Form</h2> <form> Name: <br> Age: <br> <br> <p>Select country:</p> <select name='country'> <option value='USA'>USA</option> <option value='UK'>UK</option> <option value='Canada'>Canada</option> </select> <br> <p>Select interests:</p> <label for='interest1'> Interest 1</label><br> <label for='interest2'> Interest 2</label><br> </form> </body> </html>"; var alternativePdfRenderer = new ChromePdfRenderer(); alternativePdfRenderer.RenderingOptions.CreatePdfFormsFromHtml = true; alternativePdfRenderer.RenderHtmlAsPdf(alternativeHtmlContent).SaveAs("AlternativeForm.pdf"); using IronPdf; using System; const string alternativeHtmlContent = @" <html> <body> <h2>Alternative PDF Form</h2> <form> Name: <br> Age: <br> <br> <p>Select country:</p> <select name='country'> <option value='USA'>USA</option> <option value='UK'>UK</option> <option value='Canada'>Canada</option> </select> <br> <p>Select interests:</p> <label for='interest1'> Interest 1</label><br> <label for='interest2'> Interest 2</label><br> </form> </body> </html>"; var alternativePdfRenderer = new ChromePdfRenderer(); alternativePdfRenderer.RenderingOptions.CreatePdfFormsFromHtml = true; alternativePdfRenderer.RenderHtmlAsPdf(alternativeHtmlContent).SaveAs("AlternativeForm.pdf"); Imports IronPdf Imports System Private Const alternativeHtmlContent As String = " <html> <body> <h2>Alternative PDF Form</h2> <form> Name: <br> Age: <br> <br> <p>Select country:</p> <select name='country'> <option value='USA'>USA</option> <option value='UK'>UK</option> <option value='Canada'>Canada</option> </select> <br> <p>Select interests:</p> <label for='interest1'> Interest 1</label><br> <label for='interest2'> Interest 2</label><br> </form> </body> </html>" Private alternativePdfRenderer = New ChromePdfRenderer() alternativePdfRenderer.RenderingOptions.CreatePdfFormsFromHtml = True alternativePdfRenderer.RenderHtmlAsPdf(alternativeHtmlContent).SaveAs("AlternativeForm.pdf") $vbLabelText $csharpLabel !Report .NET 与 IronPDF 的比较:图 9 - 输出 PDF:使用 IronPDF 生成 PDF 表单 6.1.5 合并 PDF 文档 您可以 将多个 PDF 文件合并 为一个文档。 #### 6.1.6 拆分PDF文档 using IronPdf; var firstHtmlContent = @"<h1>Document A</h1> <p>This is the first document.</p> <div style='page-break-after: always;'></div> <p>Continuation of Document A</p>"; var secondHtmlContent = @"<h1>Document B</h1> <p>This is the second document.</p> <div style='page-break-after: always;'></div> <p>Continuation of Document B</p>"; var pdfRenderer = new ChromePdfRenderer(); var pdfDocA = pdfRenderer.RenderHtmlAsPdf(firstHtmlContent); var pdfDocB = pdfRenderer.RenderHtmlAsPdf(secondHtmlContent); var mergedPdf = PdfDocument.Merge(pdfDocA, pdfDocB); mergedPdf.SaveAs("MergedDocuments.pdf"); using IronPdf; var firstHtmlContent = @"<h1>Document A</h1> <p>This is the first document.</p> <div style='page-break-after: always;'></div> <p>Continuation of Document A</p>"; var secondHtmlContent = @"<h1>Document B</h1> <p>This is the second document.</p> <div style='page-break-after: always;'></div> <p>Continuation of Document B</p>"; var pdfRenderer = new ChromePdfRenderer(); var pdfDocA = pdfRenderer.RenderHtmlAsPdf(firstHtmlContent); var pdfDocB = pdfRenderer.RenderHtmlAsPdf(secondHtmlContent); var mergedPdf = PdfDocument.Merge(pdfDocA, pdfDocB); mergedPdf.SaveAs("MergedDocuments.pdf"); Imports IronPdf Private firstHtmlContent = "<h1>Document A</h1> <p>This is the first document.</p> <div style='page-break-after: always;'></div> <p>Continuation of Document A</p>" Private secondHtmlContent = "<h1>Document B</h1> <p>This is the second document.</p> <div style='page-break-after: always;'></div> <p>Continuation of Document B</p>" Private pdfRenderer = New ChromePdfRenderer() Private pdfDocA = pdfRenderer.RenderHtmlAsPdf(firstHtmlContent) Private pdfDocB = pdfRenderer.RenderHtmlAsPdf(secondHtmlContent) Private mergedPdf = PdfDocument.Merge(pdfDocA, pdfDocB) mergedPdf.SaveAs("MergedDocuments.pdf") $vbLabelText $csharpLabel 反过来,IronPDF可以将单个PDF拆分为多个文档。 这可能需要在您想要分发个别页面或章节时使用。 6.1.7 加密和解密PDF IronPDF允许对 PDF 文档进行加密和解密,为敏感信息增加了一层额外的安全保护。 6.1.8 设置文档属性和元数据 IronPDF 允许对 PDF 文档进行 加密和解密,为敏感信息增加了一层额外的安全性。 using IronPdf; using System; var encryptedPdf = PdfDocument.FromFile("protected.pdf", "password"); encryptedPdf.SecuritySettings.RemovePasswordsAndEncryption(); encryptedPdf.SecuritySettings.MakePdfDocumentReadOnly("super-secret-key"); encryptedPdf.Password = "new-password"; encryptedPdf.SaveAs("secured.pdf"); using IronPdf; using System; var encryptedPdf = PdfDocument.FromFile("protected.pdf", "password"); encryptedPdf.SecuritySettings.RemovePasswordsAndEncryption(); encryptedPdf.SecuritySettings.MakePdfDocumentReadOnly("super-secret-key"); encryptedPdf.Password = "new-password"; encryptedPdf.SaveAs("secured.pdf"); Imports IronPdf Imports System Private encryptedPdf = PdfDocument.FromFile("protected.pdf", "password") encryptedPdf.SecuritySettings.RemovePasswordsAndEncryption() encryptedPdf.SecuritySettings.MakePdfDocumentReadOnly("super-secret-key") encryptedPdf.Password = "new-password" encryptedPdf.SaveAs("secured.pdf") $vbLabelText $csharpLabel 6.1.8 设置文档属性和元数据 6.1.9 PDF/A 合规性 IronPDF可以生成PDF/A合规文档,这对长期存档和记录保存是必需的。 using IronPdf; using System; var encryptedPdf = PdfDocument.FromFile("sample.pdf"); encryptedPdf.MetaData.Author = "Iron Developer"; encryptedPdf.MetaData.Keywords = "Confidential, Private"; encryptedPdf.MetaData.ModifiedDate = DateTime.Now; encryptedPdf.SaveAs("modified.pdf"); using IronPdf; using System; var encryptedPdf = PdfDocument.FromFile("sample.pdf"); encryptedPdf.MetaData.Author = "Iron Developer"; encryptedPdf.MetaData.Keywords = "Confidential, Private"; encryptedPdf.MetaData.ModifiedDate = DateTime.Now; encryptedPdf.SaveAs("modified.pdf"); Imports IronPdf Imports System Private encryptedPdf = PdfDocument.FromFile("sample.pdf") encryptedPdf.MetaData.Author = "Iron Developer" encryptedPdf.MetaData.Keywords = "Confidential, Private" encryptedPdf.MetaData.ModifiedDate = DateTime.Now encryptedPdf.SaveAs("modified.pdf") $vbLabelText $csharpLabel 6.1.10 使用 IronPDF 的 XML 报告 IronPDF 可以 生成 PDF/A 兼容 文档,这是长期归档和记录保存的要求。 6.1.10 使用 IronPDF 的 XML 报告 假设这是我们的data.xml文件: 这可以通过使用 XSLT(可扩展样式表语言转换)来实现,这是一种强大的 XML 样式表语言,用于将 XML 文档转换为 HTML、文本或甚至新的 XML 文档等其他格式。 假设这是我们的 data.xml 文件: <?xml version="1.0" encoding="UTF-8"?> <Library> <Book id="1"> <Title>The Great Gatsby</Title> <Author>F. Scott Fitzgerald</Author> <Genre>Fiction</Genre> <Year>1925</Year> </Book> <Book id="2"> <Title>To Kill a Mockingbird</Title> <Author>Harper Lee</Author> <Genre>Fiction</Genre> <Year>1960</Year> </Book> <Book id="3"> <Title>1984</Title> <Author>George Orwell</Author> <Genre>Dystopian</Genre> <Year>1949</Year> </Book> </Library> <?xml version="1.0" encoding="UTF-8"?> <Library> <Book id="1"> <Title>The Great Gatsby</Title> <Author>F. Scott Fitzgerald</Author> <Genre>Fiction</Genre> <Year>1925</Year> </Book> <Book id="2"> <Title>To Kill a Mockingbird</Title> <Author>Harper Lee</Author> <Genre>Fiction</Genre> <Year>1960</Year> </Book> <Book id="3"> <Title>1984</Title> <Author>George Orwell</Author> <Genre>Dystopian</Genre> <Year>1949</Year> </Book> </Library> XML 这是我们的 style.xslt 文件: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <html> <head> <title>Library Catalog</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } table { border-collapse: collapse; width: 100%; } th, td { text-align: left; padding: 8px; } tr:nth-child(even) { background-color: #f2f2f2; } th { background-color: #4CAF50; color: white; } </style> </head> <body> <h2>Library Catalog</h2> <table> <tr> <th>Title</th> <th>Author</th> <th>Genre</th> <th>Year</th> </tr> <xsl:for-each select="Library/Book"> <tr> <td><xsl:value-of select="Title"/></td> <td><xsl:value-of select="Author"/></td> <td><xsl:value-of select="Genre"/></td> <td><xsl:value-of select="Year"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <html> <head> <title>Library Catalog</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } table { border-collapse: collapse; width: 100%; } th, td { text-align: left; padding: 8px; } tr:nth-child(even) { background-color: #f2f2f2; } th { background-color: #4CAF50; color: white; } </style> </head> <body> <h2>Library Catalog</h2> <table> <tr> <th>Title</th> <th>Author</th> <th>Genre</th> <th>Year</th> </tr> <xsl:for-each select="Library/Book"> <tr> <td><xsl:value-of select="Title"/></td> <td><xsl:value-of select="Author"/></td> <td><xsl:value-of select="Genre"/></td> <td><xsl:value-of select="Year"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> XML 下面是我们可以采用此逻辑的代码片段: using System; using System.Xml.Xsl; using System.Xml; XslCompiledTransform transform = new XslCompiledTransform(); transform.Load("style.xslt"); XmlReader reader = XmlReader.Create("data.xml"); XmlWriterSettings settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }; using (XmlWriter writer = XmlWriter.Create("output.html", settings)) { transform.Transform(reader, writer); } License.LicenseKey = "Liecense-Key"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlFileAsPdf("output.html"); pdf.SaveAs("Report.pdf"); using System; using System.Xml.Xsl; using System.Xml; XslCompiledTransform transform = new XslCompiledTransform(); transform.Load("style.xslt"); XmlReader reader = XmlReader.Create("data.xml"); XmlWriterSettings settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }; using (XmlWriter writer = XmlWriter.Create("output.html", settings)) { transform.Transform(reader, writer); } License.LicenseKey = "Liecense-Key"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlFileAsPdf("output.html"); pdf.SaveAs("Report.pdf"); Imports System Imports System.Xml.Xsl Imports System.Xml Private transform As New XslCompiledTransform() transform.Load("style.xslt") Dim reader As XmlReader = XmlReader.Create("data.xml") Dim settings As New XmlWriterSettings With { .Indent = True, .OmitXmlDeclaration = True } Using writer As XmlWriter = XmlWriter.Create("output.html", settings) transform.Transform(reader, writer) End Using License.LicenseKey = "Liecense-Key" Dim renderer = New ChromePdfRenderer() Dim pdf = renderer.RenderHtmlFileAsPdf("output.html") pdf.SaveAs("Report.pdf") $vbLabelText $csharpLabel 您首先要使用 XSLT 样式表 (style.xslt),该样式表规定 XML 数据应如何构造为 HTML。 XslCompiledTransform 类在 .NET 中用于加载您的 XSLT 文件。 利用 XmlReader 加载您的 XML 数据 (data.xml)。 XmlReader 在此用途中效率很高,因为它提供了 XML 数据的仅向前、只读视图。 转换后的 HTML 使用配置为生成可读性好并且省略 XML 声明(在 HTML 输出中不需要)的 XmlWriter 写入到文件中 (output.html)。 HTML 文件准备好后,使用 IronPDF 的 ChromePdfRenderer 将 HTML 文档转换为 PDF。 该渲染器模拟高质量渲染引擎,确保生成的 PDF 准确表示 HTML 内容。 最后,PDF 文档被保存到文件系统中 (Report.pdf)。 此步骤结束转换过程,得出一个从原始 XML 数据派生的 PDF 文档。 这就是我们使用 XML 和 IronPDF 生成报告的方式。 我们生成的输出 PDF 文件: 有关更详细的指南,请查看关于C#报告生成的指南。 6.2 Report.NET的高级特性 有关更多详细指南,请参阅关于 C# 报告生成 的指南。 6.2 Report.NET 的高级功能 Report.NET 提供了一套先进功能,允许全面的 PDF 生成和自定义。 图像中列出的功能反映了一些这些高级功能。 让我们详细探索每一个。 6.2.1 添加字体 此功能支持在 PDF 文档中使用各种字体样式和大小。 它允许开发人员测试不同字体的外观,确保文本正确显示并符合设计规范。 using Root.Reports; using System; using System.Drawing; namespace ReportSamples { public class Test : Report { private readonly FontDef fontDef; private readonly FontProp fontProp_Title; private readonly FontProp fontProp_Label; public Test() { fontDef = FontDef.FontDefFromName(this, FontDef.StandardFont.Helvetica); fontProp_Title = new FontPropMM(fontDef, 6) { Bold = true }; fontProp_Label = new FontPropMM(fontDef, 4); } protected override void Create() { FontTest(); } private void FontTest() { FontProp fp_Title = new FontPropMM(fontDef, 12) { Bold = true }; FontProp fp = new FontPropMM(fontDef, 6); FontProp fp_Small = new FontPropMM(fontDef, 1.4); FontProp fp_XSmall = new FontPropMM(fontDef, 0.8); Page page_Cur = new Page(this); page_Cur.AddCB_MM(30, new RepString(fontProp_Title, "Font Test")); Double rX = 300; Double rY = 40; for (Int32 i = 32; i < 127; i++) { PrintCharacter(i, fp, fp_Small, fp_XSmall, rX, rY, page_Cur); } for (Int32 i = 161; i < 256; i++) { PrintCharacter(i, fp, fp_Small, fp_XSmall, rX, rY, page_Cur); } PrintCharacter('�', fp, fp_Small, fp_XSmall, rX, rY, page_Cur); } private void PrintCharacter(Int32 iChar, FontProp fp, FontProp fp_Small, FontProp fp_XSmall, Double rX, Double rY, Page page_Cur) { if (rX > 185) { rY += fp.rLineFeedMM; rX = 22; } if (rY > 280) { new Page(this); rY = 40; } Char ch = (Char)iChar; String s = ch.ToString(); page_Cur.AddMM(rX + 2, rY, new RepString(fp, s)); rX += 15; } } } using Root.Reports; using System; using System.Drawing; namespace ReportSamples { public class Test : Report { private readonly FontDef fontDef; private readonly FontProp fontProp_Title; private readonly FontProp fontProp_Label; public Test() { fontDef = FontDef.FontDefFromName(this, FontDef.StandardFont.Helvetica); fontProp_Title = new FontPropMM(fontDef, 6) { Bold = true }; fontProp_Label = new FontPropMM(fontDef, 4); } protected override void Create() { FontTest(); } private void FontTest() { FontProp fp_Title = new FontPropMM(fontDef, 12) { Bold = true }; FontProp fp = new FontPropMM(fontDef, 6); FontProp fp_Small = new FontPropMM(fontDef, 1.4); FontProp fp_XSmall = new FontPropMM(fontDef, 0.8); Page page_Cur = new Page(this); page_Cur.AddCB_MM(30, new RepString(fontProp_Title, "Font Test")); Double rX = 300; Double rY = 40; for (Int32 i = 32; i < 127; i++) { PrintCharacter(i, fp, fp_Small, fp_XSmall, rX, rY, page_Cur); } for (Int32 i = 161; i < 256; i++) { PrintCharacter(i, fp, fp_Small, fp_XSmall, rX, rY, page_Cur); } PrintCharacter('�', fp, fp_Small, fp_XSmall, rX, rY, page_Cur); } private void PrintCharacter(Int32 iChar, FontProp fp, FontProp fp_Small, FontProp fp_XSmall, Double rX, Double rY, Page page_Cur) { if (rX > 185) { rY += fp.rLineFeedMM; rX = 22; } if (rY > 280) { new Page(this); rY = 40; } Char ch = (Char)iChar; String s = ch.ToString(); page_Cur.AddMM(rX + 2, rY, new RepString(fp, s)); rX += 15; } } } Imports Root.Reports Imports System Imports System.Drawing Namespace ReportSamples Public Class Test Inherits Report Private ReadOnly fontDef As FontDef Private ReadOnly fontProp_Title As FontProp Private ReadOnly fontProp_Label As FontProp Public Sub New() fontDef = FontDef.FontDefFromName(Me, FontDef.StandardFont.Helvetica) fontProp_Title = New FontPropMM(fontDef, 6) With {.Bold = True} fontProp_Label = New FontPropMM(fontDef, 4) End Sub Protected Overrides Sub Create() FontTest() End Sub Private Sub FontTest() Dim fp_Title As FontProp = New FontPropMM(fontDef, 12) With {.Bold = True} Dim fp As FontProp = New FontPropMM(fontDef, 6) Dim fp_Small As FontProp = New FontPropMM(fontDef, 1.4) Dim fp_XSmall As FontProp = New FontPropMM(fontDef, 0.8) Dim page_Cur As New Page(Me) page_Cur.AddCB_MM(30, New RepString(fontProp_Title, "Font Test")) Dim rX As Double = 300 Dim rY As Double = 40 For i As Int32 = 32 To 126 PrintCharacter(i, fp, fp_Small, fp_XSmall, rX, rY, page_Cur) Next i For i As Int32 = 161 To 255 PrintCharacter(i, fp, fp_Small, fp_XSmall, rX, rY, page_Cur) Next i PrintCharacter(AscW(" "c), fp, fp_Small, fp_XSmall, rX, rY, page_Cur) End Sub Private Sub PrintCharacter(ByVal iChar As Int32, ByVal fp As FontProp, ByVal fp_Small As FontProp, ByVal fp_XSmall As FontProp, ByVal rX As Double, ByVal rY As Double, ByVal page_Cur As Page) If rX > 185 Then rY += fp.rLineFeedMM rX = 22 End If If rY > 280 Then Dim tempVar As New Page(Me) rY = 40 End If Dim ch As Char = ChrW(iChar) Dim s As String = ch.ToString() page_Cur.AddMM(rX + 2, rY, New RepString(fp, s)) rX += 15 End Sub End Class End Namespace $vbLabelText $csharpLabel 这包括控制图像的大小和位置,以及可能对它们应用变换或效果。 通过图像样本功能,开发人员可以将图像嵌入 PDF 文档中。 这包括控制图像的大小和位置,以及可能对其应用变换或效果。 using Root.Reports; using System.Drawing; namespace ReportSamples { public class ImageSample : Report { protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp_Title = new FontPropMM(fd, 15) { Bold = true }; FontProp fp_SubTitle = new FontPropMM(fd, 4) { Bold = true }; PenProp pp = new PenProp(this, 0.2, Color.FromArgb(235, 235, 235)); PenProp pp_Black = new PenProp(this, 0.2, Color.Black); BrushProp bp = new BrushProp(this, Color.LightGray); new Page(this); page_Cur.AddCB_MM(40, new RepString(fp_Title, "Image Sample")); System.IO.Stream stream = GetType().Assembly.GetManifestResourceStream("ReportSamples.Image.jpg"); page_Cur.AddMM(20, 90, new RepImageMM(stream, 40, Double.NaN)); page_Cur.AddMM(20, 95, new RepString(fp_SubTitle, "W = 40mm, H = auto.")); page_Cur.AddMM(67, 90, new RepImageMM(stream, 40, 20)); page_Cur.AddMM(67, 95, new RepString(fp_SubTitle, "W = 40mm, H = 20mm")); page_Cur.AddMM(114, 90, new RepImageMM(stream, Double.NaN, 30)); page_Cur.AddMM(114, 95, new RepString(fp_SubTitle, "W = auto., H = 30mm")); page_Cur.AddMM(161, 90, new RepImageMM(stream, 30, 30)); page_Cur.AddMM(161, 95, new RepString(fp_SubTitle, "W = 30mm, H = 30mm")); } } } using Root.Reports; using System.Drawing; namespace ReportSamples { public class ImageSample : Report { protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp_Title = new FontPropMM(fd, 15) { Bold = true }; FontProp fp_SubTitle = new FontPropMM(fd, 4) { Bold = true }; PenProp pp = new PenProp(this, 0.2, Color.FromArgb(235, 235, 235)); PenProp pp_Black = new PenProp(this, 0.2, Color.Black); BrushProp bp = new BrushProp(this, Color.LightGray); new Page(this); page_Cur.AddCB_MM(40, new RepString(fp_Title, "Image Sample")); System.IO.Stream stream = GetType().Assembly.GetManifestResourceStream("ReportSamples.Image.jpg"); page_Cur.AddMM(20, 90, new RepImageMM(stream, 40, Double.NaN)); page_Cur.AddMM(20, 95, new RepString(fp_SubTitle, "W = 40mm, H = auto.")); page_Cur.AddMM(67, 90, new RepImageMM(stream, 40, 20)); page_Cur.AddMM(67, 95, new RepString(fp_SubTitle, "W = 40mm, H = 20mm")); page_Cur.AddMM(114, 90, new RepImageMM(stream, Double.NaN, 30)); page_Cur.AddMM(114, 95, new RepString(fp_SubTitle, "W = auto., H = 30mm")); page_Cur.AddMM(161, 90, new RepImageMM(stream, 30, 30)); page_Cur.AddMM(161, 95, new RepString(fp_SubTitle, "W = 30mm, H = 30mm")); } } } Imports Root.Reports Imports System.Drawing Namespace ReportSamples Public Class ImageSample Inherits Report Protected Overrides Sub Create() Dim fd As New FontDef(Me, FontDef.StandardFont.Helvetica) Dim fp_Title As FontProp = New FontPropMM(fd, 15) With {.Bold = True} Dim fp_SubTitle As FontProp = New FontPropMM(fd, 4) With {.Bold = True} Dim pp As New PenProp(Me, 0.2, Color.FromArgb(235, 235, 235)) Dim pp_Black As New PenProp(Me, 0.2, Color.Black) Dim bp As New BrushProp(Me, Color.LightGray) Dim tempVar As New Page(Me) page_Cur.AddCB_MM(40, New RepString(fp_Title, "Image Sample")) Dim stream As System.IO.Stream = Me.GetType().Assembly.GetManifestResourceStream("Image.jpg") page_Cur.AddMM(20, 90, New RepImageMM(stream, 40, Double.NaN)) page_Cur.AddMM(20, 95, New RepString(fp_SubTitle, "W = 40mm, H = auto.")) page_Cur.AddMM(67, 90, New RepImageMM(stream, 40, 20)) page_Cur.AddMM(67, 95, New RepString(fp_SubTitle, "W = 40mm, H = 20mm")) page_Cur.AddMM(114, 90, New RepImageMM(stream, Double.NaN, 30)) page_Cur.AddMM(114, 95, New RepString(fp_SubTitle, "W = auto., H = 30mm")) page_Cur.AddMM(161, 90, New RepImageMM(stream, 30, 30)) page_Cur.AddMM(161, 95, New RepString(fp_SubTitle, "W = 30mm, H = 30mm")) End Sub End Class End Namespace $vbLabelText $csharpLabel 6.2.3 列表布局管理器 列表布局管理器提供了一种将列表添加到 PDF 文档的方法。 这对于创建有序或无序列表、定制列表缩进、项目符号样式以及管理文档中列表项的整体布局非常有用。 using Root.Reports; using System.Drawing; namespace ReportSamples { public class ListLayoutManagerSample : Report { private Double rMarginLeft = 20; // millimeters private Double rWidth = 175; // millimeters protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp = new FontPropMM(fd, 1.9); Double rY = 40; // vertical position in millimeters new Page(this); FontProp fp_Title = new FontPropMM(fd, 8); page_Cur.AddCB_MM(rY, new RepString(fp_Title, "List Layout Manager Sample")); rY += 18; ListLayoutManager llm = null; using (llm = new ListLayoutManager(this)) { PenProp pp_BorderLine = new PenPropMM(this, 0.4, Color.Blue); PenProp pp_GridLine = new PenPropMM(this, 0.1, Color.Blue); // Configuration for columns TlmColumn col_Number = new TlmColumnMM(llm, 10); col_Number.tlmCellDef_Default.rAlignH = RepObj.rAlignCenter; col_Number.tlmCellDef_Default.rAlignV = RepObj.rAlignCenter; col_Number.tlmCellDef_Default.penProp_LineLeft = pp_BorderLine; TlmColumn col_Text = new TlmColumnMM(llm, 100); col_Text.tlmCellDef_Default.tlmTextMode = TlmTextMode.MultiLine; TlmColumn col_Author = new TlmColumnMM(llm, rWidth - llm.rWidthMM); col_Author.tlmCellDef_Default.penProp_LineRight = pp_BorderLine; col_Author.tlmCellDef_Default.brushProp_Back = new BrushProp(this, Color.FromArgb(255, 210, 210)); llm.container_CreateMM(page_Cur, rMarginLeft, rY); // immediately creates a container // Adding rows and content // ... // Rows and content omitted for brevity // ... } rY += llm.rCurY_MM + 1.5; fp.rSizeMM = 1.5; page_Cur.AddRT_MM(rMarginLeft + rWidth, rY, new RepString(fp, "End of list")); } } } using Root.Reports; using System.Drawing; namespace ReportSamples { public class ListLayoutManagerSample : Report { private Double rMarginLeft = 20; // millimeters private Double rWidth = 175; // millimeters protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp = new FontPropMM(fd, 1.9); Double rY = 40; // vertical position in millimeters new Page(this); FontProp fp_Title = new FontPropMM(fd, 8); page_Cur.AddCB_MM(rY, new RepString(fp_Title, "List Layout Manager Sample")); rY += 18; ListLayoutManager llm = null; using (llm = new ListLayoutManager(this)) { PenProp pp_BorderLine = new PenPropMM(this, 0.4, Color.Blue); PenProp pp_GridLine = new PenPropMM(this, 0.1, Color.Blue); // Configuration for columns TlmColumn col_Number = new TlmColumnMM(llm, 10); col_Number.tlmCellDef_Default.rAlignH = RepObj.rAlignCenter; col_Number.tlmCellDef_Default.rAlignV = RepObj.rAlignCenter; col_Number.tlmCellDef_Default.penProp_LineLeft = pp_BorderLine; TlmColumn col_Text = new TlmColumnMM(llm, 100); col_Text.tlmCellDef_Default.tlmTextMode = TlmTextMode.MultiLine; TlmColumn col_Author = new TlmColumnMM(llm, rWidth - llm.rWidthMM); col_Author.tlmCellDef_Default.penProp_LineRight = pp_BorderLine; col_Author.tlmCellDef_Default.brushProp_Back = new BrushProp(this, Color.FromArgb(255, 210, 210)); llm.container_CreateMM(page_Cur, rMarginLeft, rY); // immediately creates a container // Adding rows and content // ... // Rows and content omitted for brevity // ... } rY += llm.rCurY_MM + 1.5; fp.rSizeMM = 1.5; page_Cur.AddRT_MM(rMarginLeft + rWidth, rY, new RepString(fp, "End of list")); } } } Imports Root.Reports Imports System.Drawing Namespace ReportSamples Public Class ListLayoutManagerSample Inherits Report Private rMarginLeft As Double = 20 ' millimeters Private rWidth As Double = 175 ' millimeters Protected Overrides Sub Create() Dim fd As New FontDef(Me, FontDef.StandardFont.Helvetica) Dim fp As FontProp = New FontPropMM(fd, 1.9) Dim rY As Double = 40 ' vertical position in millimeters Dim tempVar As New Page(Me) Dim fp_Title As FontProp = New FontPropMM(fd, 8) page_Cur.AddCB_MM(rY, New RepString(fp_Title, "List Layout Manager Sample")) rY += 18 Dim llm As ListLayoutManager = Nothing llm = New ListLayoutManager(Me) Using llm Dim pp_BorderLine As PenProp = New PenPropMM(Me, 0.4, Color.Blue) Dim pp_GridLine As PenProp = New PenPropMM(Me, 0.1, Color.Blue) ' Configuration for columns Dim col_Number As TlmColumn = New TlmColumnMM(llm, 10) col_Number.tlmCellDef_Default.rAlignH = RepObj.rAlignCenter col_Number.tlmCellDef_Default.rAlignV = RepObj.rAlignCenter col_Number.tlmCellDef_Default.penProp_LineLeft = pp_BorderLine Dim col_Text As TlmColumn = New TlmColumnMM(llm, 100) col_Text.tlmCellDef_Default.tlmTextMode = TlmTextMode.MultiLine Dim col_Author As TlmColumn = New TlmColumnMM(llm, rWidth - llm.rWidthMM) col_Author.tlmCellDef_Default.penProp_LineRight = pp_BorderLine col_Author.tlmCellDef_Default.brushProp_Back = New BrushProp(Me, Color.FromArgb(255, 210, 210)) llm.container_CreateMM(page_Cur, rMarginLeft, rY) ' immediately creates a container ' Adding rows and content ' ... ' Rows and content omitted for brevity ' ... End Using rY += llm.rCurY_MM + 1.5 fp.rSizeMM = 1.5 page_Cur.AddRT_MM(rMarginLeft + rWidth, rY, New RepString(fp, "End of list")) End Sub End Class End Namespace $vbLabelText $csharpLabel 6.2.4 PDF-属性 这指的是设置和修改 PDF 文档本身的各种属性的能力,例如元数据(作者、标题、主题)、查看偏好和安全设置,如加密和访问权限。 using Root.Reports; using System; namespace ReportSamples { public class PdfPropertiesSample : Report { public PdfPropertiesSample() { PdfFormatter pf = (PdfFormatter)formatter; pf.sTitle = "PDF Sample"; pf.sAuthor = "Otto Mayer, mot@root.ch"; pf.sSubject = "Sample of some PDF features"; pf.sKeywords = "Sample PDF RSF"; pf.sCreator = "RSF Sample Application"; pf.dt_CreationDate = new DateTime(2002, 8, 15, 0, 0, 0, 0); pf.pageLayout = PageLayout.TwoColumnLeft; pf.bHideToolBar = true; pf.bHideMenubar = false; pf.bHideWindowUI = true; pf.bFitWindow = true; pf.bCenterWindow = true; pf.bDisplayDocTitle = true; } protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp = new FontPropMM(fd, 4); FontProp fp_Title = new FontPropMM(fd, 11); fp_Title.bBold = true; Page page = new Page(this); page.AddCB_MM(40, new RepString(fp_Title, "PDF Properties Sample")); fp_Title.rSizeMM = 8; page.AddCB_MM(100, new RepString(fp_Title, "First Page")); page.AddCB_MM(120, new RepString(fp, "Choose <Document Properties, Summary> from the")); page.AddCB_MM(126, new RepString(fp, "File menu to display the document properties")); page = new Page(this); page.AddCB_MM(100, new RepString(fp_Title, "Second Page")); } } } using Root.Reports; using System; namespace ReportSamples { public class PdfPropertiesSample : Report { public PdfPropertiesSample() { PdfFormatter pf = (PdfFormatter)formatter; pf.sTitle = "PDF Sample"; pf.sAuthor = "Otto Mayer, mot@root.ch"; pf.sSubject = "Sample of some PDF features"; pf.sKeywords = "Sample PDF RSF"; pf.sCreator = "RSF Sample Application"; pf.dt_CreationDate = new DateTime(2002, 8, 15, 0, 0, 0, 0); pf.pageLayout = PageLayout.TwoColumnLeft; pf.bHideToolBar = true; pf.bHideMenubar = false; pf.bHideWindowUI = true; pf.bFitWindow = true; pf.bCenterWindow = true; pf.bDisplayDocTitle = true; } protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp = new FontPropMM(fd, 4); FontProp fp_Title = new FontPropMM(fd, 11); fp_Title.bBold = true; Page page = new Page(this); page.AddCB_MM(40, new RepString(fp_Title, "PDF Properties Sample")); fp_Title.rSizeMM = 8; page.AddCB_MM(100, new RepString(fp_Title, "First Page")); page.AddCB_MM(120, new RepString(fp, "Choose <Document Properties, Summary> from the")); page.AddCB_MM(126, new RepString(fp, "File menu to display the document properties")); page = new Page(this); page.AddCB_MM(100, new RepString(fp_Title, "Second Page")); } } } Imports Root.Reports Imports System Namespace ReportSamples Public Class PdfPropertiesSample Inherits Report Public Sub New() Dim pf As PdfFormatter = CType(formatter, PdfFormatter) pf.sTitle = "PDF Sample" pf.sAuthor = "Otto Mayer, mot@root.ch" pf.sSubject = "Sample of some PDF features" pf.sKeywords = "Sample PDF RSF" pf.sCreator = "RSF Sample Application" pf.dt_CreationDate = New DateTime(2002, 8, 15, 0, 0, 0, 0) pf.pageLayout = PageLayout.TwoColumnLeft pf.bHideToolBar = True pf.bHideMenubar = False pf.bHideWindowUI = True pf.bFitWindow = True pf.bCenterWindow = True pf.bDisplayDocTitle = True End Sub Protected Overrides Sub Create() Dim fd As New FontDef(Me, FontDef.StandardFont.Helvetica) Dim fp As FontProp = New FontPropMM(fd, 4) Dim fp_Title As FontProp = New FontPropMM(fd, 11) fp_Title.bBold = True Dim page As New Page(Me) page.AddCB_MM(40, New RepString(fp_Title, "PDF Properties Sample")) fp_Title.rSizeMM = 8 page.AddCB_MM(100, New RepString(fp_Title, "First Page")) page.AddCB_MM(120, New RepString(fp, "Choose <Document Properties, Summary> from the")) page.AddCB_MM(126, New RepString(fp, "File menu to display the document properties")) page = New Page(Me) page.AddCB_MM(100, New RepString(fp_Title, "Second Page")) End Sub End Class End Namespace $vbLabelText $csharpLabel 6.2.5 从文本生成 PDF 从文本生成 PDF 功能展示了库在 PDF 中添加和定制文本内容的能力。 这包括设置文本对齐、行距、颜色,并应用文本效果,如粗体或斜体。 7. 文档与支持 7.1 IronPDF IronPDF 以其广泛且 详细的文档 而闻名。 IronPDF 提供了一个结构良好的文档部分,包括设置说明、教程和 API 参考。 指南的结构旨在帮助初学者和经验丰富的开发人员快速找到所需的信息。 对于社区驱动的支持,开发人员可以转向论坛和社区讨论。 在这里,他们可以提问、分享经验,并从其他用户那里找到答案。 IronPDF 还通过工单系统提供专业支持,工程师可以直接从 IronPDF 团队获得帮助。 该服务可能是付费许可证的一部分,提供更直接和即时的帮助。 7.2 Report.NET Report.NET,作为一个开源库,对于文档和支持有不同的处理方式。 文档往往更具技术性,可能需要挖掘才能找到所需信息。 由于Report.NET是一个免费且开源的库,它不提供正式的专业支持。 开发人员依赖社区获取帮助,或者可能需要聘请专业人士以处理更深入的问题。 8. 许可模式 8.1 IronPDF的许可模式 IronPDF 提供多种许可模式以满足不同的开发和部署需求,确保适合所有规模的项目和组织。 8.1 IronPDF 许可证模型 IronPDF 提供多种 许可证模型 以满足不同的开发和部署需求,确保适合所有规模的项目和组织。 以下是概述: Lite 许可证 ($799 美元):这是最基本的选项,适合在一个地点进行单个项目的个人开发者。 它提供电子邮件支持,但不包括免版税的再分发。 Plus 许可证 ($1,199 美元):针对小型团队,此许可证支持最多三位开发人员在三个地点进行三个项目。 它增强了支持,包括24小时的电子邮件和聊天支持,以及电话支持。 专业许可证($2,399 USD):该许可证设计用于较大的团队和项目,最多可容纳10名开发人员在10个地点上处理10个项目。 它包括所有Plus支持选项,并增加了屏幕共享支持,以便进行更互动的问题解决。 免费试用许可证:适合评估目的,此试用许可证允许您免费试用IronPDF。然而,它仅供私人使用,生成的PDF不应发布在任何公共或企业互联网或内联网项目上。 除了核心许可证外,还有扩展覆盖的选项: 免版税再分发:如果您需要在将要分发或销售的软件产品中包含IronPDF,则需要免版税再分发覆盖。 这对于SaaS和OEM再分发的定价为$1,199。 8.2 Report.NET的许可模式 您可以选择 1 年或 5 年的支持套餐,后者比年度套餐更省钱。 8.2 Report.NET 许可证模型 Report.NET在LGPL许可证下免费分发。 LGPL(较宽松公共许可证)是一种免费软件许可证,允许用户运行、研究、共享和修改软件。 该许可证确保Report.NET库可以在开源和专有软件中免费使用,只要LGPL许可的代码部分没有被修改。 如果它们被修改,那么这些修改必须以相同的许可证进行共享。 9. 结论 在查看IronPDF和Report.NET时,我们检查了各种元素,例如它们的功能、所提供的功能范围、易用性、支持服务及其许可方式。 IronPDF提供了一整套功能,使开发人员不仅可以从HTML、图像和文本创建和编辑PDF文件,还可以实现加密、数字签名以及自定义页眉/页脚等高级功能。 对不同许可的支持意味着它可以适应从单独开发者到大型企业的不同规模项目。 其全面的文档和专业的支持结构使其适合需要持续更新和直接援助的项目。 IronPDF还提供了IronPDF的免费试用版,起价$799。 相比之下,Report.NET是一个擅长生成PDF文档的简单工具。 其LGPL许可证意味着开发人员在个人和商业项目中使用它没有重大限制,较为方便。 虽然它可能没有提供与IronPDF相同级别的结构化支持,Report.NET的开源性质鼓励社区的投入和帮助。 你在IronPDF和Report.NET之间的决策将取决于项目的具体需求。 如果您的项目需要详细的PDF创建和操作以及专业支持的支持,IronPDF可能是首选。 请注意Report.NET 是其各自所有者的注册商标。 本网站与Report.NET没有关联,不由其支持或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映的是撰写时的公开信息。 常见问题解答 如何在C#中将HTML转换为PDF? 你可以使用IronPDF的代码方法 RenderHtmlAsPdf 将HTML字符串转换为PDF。你还可以使用 RenderHtmlFileAsPdf 将HTML文件转换为PDF。 用于创建和编辑 PDF 文档的 C# 图书馆的主要功能是什么? IronPDF 提供 HTML 转 PDF、PDF 高级编辑功能,包括合并和拆分 PDF、表单处理、加密和跨平台兼容性。 IronPDF 如何处理 PDF 安全性? IronPDF 支持实施安全措施,如加密和密码保护,以确保 PDF 文档中的敏感信息保持安全。 IronPDF 可以用于高级 PDF 编辑吗? 是的,IronPDF 提供高级编辑功能,如合并和拆分 PDF、表单处理,页眉和页脚的定制。 IronPDF 可用的文档和支持选项是什么? IronPDF 提供详细文档、社区论坛和专业支持选项,包括电子邮件、聊天和电话支持,具体取决于许可证。 IronPDF提供哪些许可选项? IronPDF 提供多种许可证,包括 Lite、Plus 和 Professional,每个许可证适用于不同项目规模和支持需求。它还提供免费试用以供评估。 IronPDF 是一个跨平台的 PDF 图书馆吗? 是的,IronPDF 旨在无缝运行在 .NET 平台上,包括 .NET Core,确保在不同操作系统之间的兼容性。 使用 IronPDF 进行 PDF 生成的优势是什么? IronPDF 以其从 HTML 创建、编辑和呈现 PDF 的强大功能而闻名,并因其详细的文档被开发人员青睐。 使用 IronPDF 时的一些常见故障排除方案是什么? 常见问题包括 PDF 中 HTML 元素的渲染不正确,通常可以通过确保 CSS 兼容性和使用 IronPDF 的最新版本来解决。 IronPDF 与开源 PDF 图书馆相比如何? IronPDF 提供更先进的功能和专业支持,而开源解决方案如 Report.NET 提供简单性和社区驱动的支持。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布十二月 18, 2025 哪个 ASP PDF 库能为 .NET Core 开发带来最大价值? 发现适合ASP.NET Core应用程序的最佳PDF库。比较IronPDF的Chrome引擎与Aspose和Syncfusion的替代品。 阅读更多 已发布十二月 3, 2025 IronPDF 与 iTextSharp 在 PDF 文档中使用页眉和页脚将 HTML 转换为 PDF 比较 iTextSharp 和 IronPDF 为 PDF 添加页眉和页脚的功能。代码示例、页码和 HTML 页眉实现。 阅读更多 已发布十二月 3, 2025 使用 IronPDF 解决 iTextSharp HTML 转 PDF 时出现的 "文档无页 "错误 iTextSharp HTML to PDF 在解析失败时不会出现页面错误。了解 XMLWorker 为什么会出现同样的问题,发现 IronPDF 可靠的 HTML 转换解决方案。 阅读更多 Compdfkit和IronPDF之间的比较C# 报告工具(功能比较)
已发布十二月 18, 2025 哪个 ASP PDF 库能为 .NET Core 开发带来最大价值? 发现适合ASP.NET Core应用程序的最佳PDF库。比较IronPDF的Chrome引擎与Aspose和Syncfusion的替代品。 阅读更多
已发布十二月 3, 2025 IronPDF 与 iTextSharp 在 PDF 文档中使用页眉和页脚将 HTML 转换为 PDF 比较 iTextSharp 和 IronPDF 为 PDF 添加页眉和页脚的功能。代码示例、页码和 HTML 页眉实现。 阅读更多
已发布十二月 3, 2025 使用 IronPDF 解决 iTextSharp HTML 转 PDF 时出现的 "文档无页 "错误 iTextSharp HTML to PDF 在解析失败时不会出现页面错误。了解 XMLWorker 为什么会出现同样的问题,发现 IronPDF 可靠的 HTML 转换解决方案。 阅读更多