产品比较 Report .NET和IronPDF之间比较 Curtis Chau 已更新:八月 20, 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 In this article, we'll be taking a close look at two popular C# libraries used for working with PDF files: IronPDF - The .NET PDF Library for C# Developers and 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将根据您的规格生成一个新的控制台应用程序项目。 这一过程可能需要一些时间。 ## 4. 安装 IronPDF Library 要在项目中利用IronPDF 的功能,首先需要安装该库。有多种方法可以实现,每种方法适合不同的开发工作流程或偏好。 以下是在Visual Studio项目中安装IronPDF库的三种常见方法。 4.1 使用NuGet包管理器安装 Visual Studio中的NuGet包管理器UI提供了一种简单的方法来浏览、选择和安装包。 在Visual Studio中,导航到解决方案资源管理器中的项目,右键单击它并选择"管理NuGet包..."选项。 单击"浏览"标签并在搜索框中键入"IronPDF"。 在搜索结果中找到IronPDF包,选择它,然后单击"安装"按钮。 Visual Studio将自动处理下载和安装。 ### 4.2 使用NuGet包管理器控制台安装 对于那些偏好使用命令行工具的人来说,NuGet包管理器控制台是一个有力的替代方案。 打开控制台: 在Visual Studio的"工具"菜单中,转到"NuGet包管理器" > "包管理器控制台"。 安装命令:在控制台中输入以下命令然后按回车: 该命令指示NuGet下载并安装IronPDF的最新版本到项目中。 4.3 使用NuGet网站安装 Install-Package IronPdf 如果您偏好手动下载包或需要IronPDF的特定版本,NuGet网站是一个不错的选择。 访问NuGet网站: 前往nuget.org并搜索"IronPDF"。 下载包: 在IronPDF 页中,选择您需要的版本并下载.nupkg文件。 手动安装: 下载完成后,您可以手动将该包添加到项目中。 在 Visual Studio 中,转到"工具"菜单,然后"选项" > "NuGet 包管理器" > "包源"。 添加一个指向下载的.nupkg文件的文件夹的新源。最后,使用 Visual Studio 中的包管理器UI或控制台从本地图源中安装包。 ## 5. 安装 Report.NET Library 打开您的网络浏览器,转到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 的项目。 2. 手动添加库:将库包含在项目中有几种方法: 作为已编译程序集:如果 GitHub 存储库中包含已编译的 DLL 文件,您可以简单地将该 DLL 添加为项目中的引用。 在项目的解决方案资源管理器中右键单击“引用”,选择“添加引用...”,然后浏览并选择 DLL 文件。 通过包含源代码文件:如果您偏好直接包含源代码或存储库不提供编译好的 DLL 文件,您可以将源代码文件添加到项目中。 在解决方案资源管理器中右键单击项目,选择"添加" > "现有项目...",然后导航并选择提取的 Report.NET 源代码文件。 确保兼容性:确保您的项目目标框架版本与Report.NET库要求的.NET框架版本相兼容。 ## 6. IronPDF与Report.NET C#的高级功能 6.1 IronPDF的高级特性 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内容的应用程序尤其有用。 6.1.1.2 HTML文件到PDF 类似地,IronPDF可以将现有的HTML文件转换成PDF文档。 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文档来实现的。 #### 6.1.1.3 URL到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 IronPDF还能够从实时URL渲染PDF。 这让开发人员可以输入网络地址,IronPDF将从URL获取HTML内容并将其渲染为PDF。 #### 6.1.2 编辑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 使用 IronPDF,您可以编辑现有的 PDF 文档。 这包括添加文本、图像和页面或从文档中删除页面。 您还可以查找和替换 PDF文档中的文本。 #### 6.1.3 提取文本和图像 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 该库可以从PDF文件中提取文本和图像,与Crystal Reports相似,可用于索引、搜索或重新利用内容。 6.1.4 生成 PDF 表单 IronPDF支持PDF表单的创建。 开发人员可以在PDF中以编程方式创建表单,用户可以填写这些表单。 #### 6.1.5 合并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 您可以将多个 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 设置文档属性和元数据 使用该库,设置诸如标题、作者和元数据等文档属性非常简单。 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.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不直接支持XML到PDF的转换,但可行的方法是首先将XML数据转换为HTML格式。 这通过使用XSLT(可扩展样式表语言转换)实现,这是一种设计用于将XML文档转换为其他格式(如HTML、文本或甚至新的XML文档)的强大XML样式表语言。 假设这是我们的data.xml文件: 并且这是我们的style.xslt文件: 以下是我们如何实施此逻辑的代码片段: <?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 您首先使用一个决定XML数据如何结构化为HTML的XSLT样式表(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 .NET中的XslCompiledTransform类用于加载您的XSLT文件。 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 使用XmlReader加载您的XML数据(data.xml)。 XmlReader通常效率高,因为它提供对XML数据的单向、只读视图。 使用配置为生成可读性好的缩进HTML并避免不必要的XML声明的XmlWriter,将转换后的HTML写入文件(output.html)。 4. 准备好HTML文件后,使用IronPDF的ChromePdfRenderer将HTML文档转换成PDF。 此渲染器模仿高质量渲染引擎,确保生成的PDF准确地表示HTML内容。 最后,PDF文档被保存至文件系统(Report.pdf)。 这个步骤完成了转换过程,生成一个源自原始XML数据的PDF文档。 这就是我们使用XML和IronPDF生成报告的方法。 我们生成的输出PDF文件: 我们还可以以编程方式创建SAP交互式报告,然后使用IronPDF进行转换。 有关更详细的指南,请查看关于C#报告生成的指南。 6.2 Report.NET的高级特性 Report.NET 提供了一套允许全面生成PDF以及自定义的高级功能。 图片中列出的功能体现了一些这些高级功能。 让我们详细探讨每个功能。 #### 6.2.1 字体添加 这个功能允许在PDF文档中使用各种字体样式和大小。 它允许开发人员测试不同字体的外观,确保文本按设计规范正确显示。 #### 6.2.2 图像嵌入 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文档中。 这包括控制图像的大小和位置,以及可能对它们应用变换或效果。 #### 6.2.3 列表布局管理器 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 列表布局管理器提供了一种向PDF文档添加列表的方法。 这对于创建有序或无序列表、自定义列表缩进、项目符号样式以及在文档中管理列表项的整体布局非常有用。 #### 6.2.4 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 这指的是能够设置和修改PDF文档本身的各项属性,如元数据(作者、标题、主题)、查看偏好设置和加密及访问权限等安全设置。 6.2.5 PDF 从文本 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 这包括设置文本对齐、行距、颜色,并应用加粗或斜体等文本效果。 7. 文档和支持 IronPDF提供了一个组织良好的文档部分,其中包括设置说明、教程和API参考。 详细的文档而闻名。 IronPDF提供了一个组织良好的文档部分,其中包括设置说明、教程和API参考。 IronPDF is known for its extensive and 指南结构化地帮助初学者和有经验的开发人员快速找到所需信息。 对于社区驱动的支持,开发人员可以转向论坛和社区讨论。 在这里,他们可以提问、分享经验并从其他用户那里找到答案。 IronPDF还通过票务系统提供专业支持,工程师可以直接从IronPDF团队获得帮助。 这种服务可能是付费许可的一部分,提供更直接和即时的支持。 文档可能没有商业化库那么详细,但对于入门和处理常见任务已经足够。 Report.NET 作为一个开源库,其文档和支持方式与商业化库不同。 文档可能没有商业化库那么详细,但对于入门和处理常见任务已经足够。 该库的文档可以在GitHub存储库中找到,或作为源代码中的内联注释。 文档往往更具技术性,可能需要挖掘才能找到所需信息。 由于Report.NET是一个免费且开源的库,它不提供正式的专业支持。 开发人员依赖社区获取帮助,或者可能需要聘请专业人士以处理更深入的问题。 8. 许可模式 8.1 IronPDF的许可模式 IronPDF 提供多种许可模式以满足不同的开发和部署需求,确保适合所有规模的项目和组织。 以下是概述: Lite 许可 ($799 USD):这是最基本的选项,适合从一个位置进行单个项目开发的个人开发人员。 它提供电子邮件支持,但不涵盖免版税再分发。 Plus 许可 ($1,199 USD):针对小团队,这种许可支持多达三名开发人员在三个项目在三个地点开发。 它增强了支持,包含24小时电子邮件和聊天支持,以及电话支持。 专业许可 ($2,399 USD):这适合于较大团队和项目,容纳多达10名开发人员横跨10个项目在10个地方开发。 它包含 Plus 所有的支持选项,并增加了屏幕共享支持以用于更具交互性的疑难解除。 免费试用许可:这对评估目的是理想的,这种试用许可允许您无成本地试用 IronPDF。然而,它旨在仅供私人使用,生成的PDF不应发布到任何公共或企业的互联网或内联网项目中。 除核心许可之外,还有扩展覆盖的选项: 免版税再分发:如果您需要将 IronPDF 包含到将分发或出售的软件产品中,需要免版税再分发覆盖。 这对SaaS和OEM再分发定价为$1,199。 扩展支持与更新:该附加功能确保您获得持续的产品更新和支持。 您可以从1年或5年的支持套餐中进行选择,后者相比年度选项提供了节省。 8.2 Report.NET的许可模式 You can choose from 1-year or 5-year support packages, with the latter offering savings over the annual option. 8.2 Report.NET License Model Report.NET在LGPL许可证下免费分发。 LGPL(较宽松公共许可证)是一种免费软件许可证,允许用户运行、研究、共享和修改软件。 该许可证确保Report.NET库可以在开源和专有软件中免费使用,只要LGPL许可的代码部分没有被修改。 如果它们被修改,那么这些修改必须以相同的许可证进行共享。 9. 结论 When looking at IronPDF and Report.NET, we've examined various elements such as their capabilities, the range of features they offer, ease of use, support services, and how they are licensed. IronPDF提供了一套丰富的功能,使开发人员不仅可以从HTML、图像和文本创建和编辑PDF文件,还可以实现如加密、数字签名和定制页眉/页脚等高级功能。 对不同许可的支持意味着它可以适应从单独开发者到大型企业的不同规模项目。 其全面的文档和专业的支持结构使其适合需要持续更新和直接援助的项目。 IronPDF还提供了IronPDF的免费试用版,起价$799。 相比之下,Report.NET是一个擅长生成PDF文档的简单工具。 其LGPL许可证意味着开发人员在个人和商业项目中使用它没有重大限制,较为方便。 虽然它可能没有提供与IronPDF相同级别的结构化支持,Report.NET的开源性质鼓励社区的投入和帮助。 你在IronPDF和Report.NET之间的决策将取决于项目的具体需求。 如果您的项目需要详细的PDF创建和操作以及专业支持的支持,IronPDF可能是首选。 [{i:(Report.NET是其各自所有者的注册商标。 本网站与Report.NET没有关联,不由其支持或赞助。 所有产品名称、徽标和品牌均为其各自所有者的财产。 比较仅供参考,反映的是撰写时的公开信息。] 常见问题解答 如何在C#中将HTML转换为PDF? 你可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF。你还可以使用RenderHtmlFileAsPdf将HTML文件转换为PDF。 用于创建和编辑 PDF 文档的 C# 库的主要功能是什么? IronPDF 提供 HTML 到 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 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布十一月 13, 2025 比较 C# HTML 到 PDF 开源与 IronPDF 比较开源 HTML 到 PDF 库与 IronPDF for C#。发现哪个解决方案为您的 .NET 项目提供最佳的 PDF 生成能力。 阅读更多 已发布十月 27, 2025 哪种 ASP.NET Core PDF 库性价比最高? 发现适合ASP.NET Core应用程序的最佳PDF库。比较IronPDF的Chrome引擎与Aspose和Syncfusion的替代品。 阅读更多 已发布十月 27, 2025 如何使用 Aspose C# 与 IronPDF 创作 PDF 通过此逐步指南,学习如何使用 Aspose C# 与 IronPDF 创建 PDF,专为开发人员设计。 阅读更多 Compdfkit和IronPDF之间的比较C# 报告工具(功能比较)
已发布十一月 13, 2025 比较 C# HTML 到 PDF 开源与 IronPDF 比较开源 HTML 到 PDF 库与 IronPDF for C#。发现哪个解决方案为您的 .NET 项目提供最佳的 PDF 生成能力。 阅读更多
已发布十月 27, 2025 哪种 ASP.NET Core PDF 库性价比最高? 发现适合ASP.NET Core应用程序的最佳PDF库。比较IronPDF的Chrome引擎与Aspose和Syncfusion的替代品。 阅读更多
已发布十月 27, 2025 如何使用 Aspose C# 与 IronPDF 创作 PDF 通过此逐步指南,学习如何使用 Aspose C# 与 IronPDF 创建 PDF,专为开发人员设计。 阅读更多