产品比较

Report .NET 与 IronPDF 的比较

发布 2024年四月29日
分享:

在本文中,我们将仔细研究用于处理 PDF 文件的两个常用 C# 库: IronPDF报告.NET.对于需要通过 C# 应用程序创建、修改或与 PDF 文档交互的开发人员来说,这些工具是必不可少的。这两个库都提供了一系列功能,旨在使 PDF 的处理更简单、更高效,但它们的处理方式各不相同。

IronPDF 和 Report.NET 使开发人员能够动态生成文档、编辑内容并从 PDF 中提取文本和图像。它们还支持表单处理、添加数字签名,并确保应用程序可以在不同平台上处理 PDF 而不会丢失文档的保真度。这意味着,无论使用何种设备或操作系统,PDF 文档的外观和功能都能保持原样。

在整个比较过程中,我们将深入探讨每个库提供的具体功能、它们是如何运行的,提供代码片段来说明如何使用它们,并讨论它们的许可条款。本次比较旨在让开发人员清楚地了解每个库的功能,帮助他们决定哪个库最适合他们的项目要求。让我们来分析一下IronPDFReport.NET的功能和区别,重点是简洁性和对开发人员的实用见解。

1.Report.NET C# Library

报告.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 Core 在内的 .NET 平台上无缝运行,确保应用程序可在任何操作系统上生成和管理 PDF。

1.1.5 个性化和风格化

该库为 PDF 文档提供了大量自定义选项,允许开发人员调整布局、样式和整体外观,以满足其特定需求。

1.1.6 开放源代码

作为一个开源工具,Report.NET 受益于社区的贡献,确保了它能够不断更新并获得新的功能。这种社区支持还意味着开发人员可以获得丰富的知识和资源。

2.IronPDF C# Library

IronPDF 是一个全面的 .NET 库,可在 .NET 应用程序中方便地创建、操作和渲染 PDF 文档。该工具既能从 HTML 生成 PDF,又能直接编辑现有的 PDF 文件,因此非常引人注目。它对创建报告非常有帮助。IronPDF 还能与 SQL Server Reporting Services 平滑集成。我们可以使用 IronPDF 创建终端用户报表设计器,从而创建报表工具和报表查看器。

2.1 IronPDF 的主要功能

2.1.1 HTML 至 PDF 转换

IronPDF 的核心优势之一是其将 HTML 转换为 PDF 的能力。 将 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 自定义页眉和页脚

程序库允许 自定义标题 和页脚。这一功能对于在各页中添加一致的品牌、页码或文档标题至关重要,可增强输出的专业外观。

3.在 Visual Studio 中创建控制台项目

在 Visual Studio IDE 中创建控制台应用程序是一个简单明了的过程,包括几个步骤。

3.1 启动 Visual Studio

首先打开 Microsoft Visual Studio。如果没有安装,则需要从 微软官方网站.安装完成后,启动可视化工作室。

3.2 创建新项目

打开 Visual Studio 后,您将看到启动窗口。在这里,选择 "创建一个新项目 "选项,即可开始设置一个新的控制台应用程序。

Report .NET 与 IronPDF 的比较:图 1 - 打开 Visual Studio,点击 "Create a new project" 选项。

3.3 选择项目类型

在 "创建新项目 "窗口中,你会看到各种项目模板。在搜索框中键入 "控制台 "以筛选选项,然后从列表中选择 "控制台应用程序"。确保选择与你希望使用的编程语言(如 C#)相对应的模板。

Report .NET 与 IronPDF 之间的比较:图 2 - 接下来,选择 C# 编程语言中的 "Console App" 项目类型。

3.4 配置项目

选择控制台应用程序模板后,点击 "Next(下一步)"进入项目配置页面。在此,您需要提供有关项目的一些详细信息:

  • 项目名称:为您的项目起一个有意义的名称,以反映其目的。

    • 位置:选择要保存项目文件的计算机位置。

Report .NET 与 IronPDF 之间的比较:图 3 - 为控制台应用程序项目指定项目名称和位置。默认情况下,解决方案名称与项目名称相同,但也可以更改。

  • 解决方案名称:默认情况下,该名称与项目名称相同,但如果计划在同一解决方案中包含多个项目,则可以更改该名称。

    • 框架:选择您要针对的 .NET Framework 版本。如果不确定,请选择最新版本。

Report .NET 与 IronPDF 的比较:图 4 - 选择您需要的 .NET Framework 版本。如果不确定,请选择最新版本。

3.5 创建项目

填写完所有必要信息后,点击 "创建 "按钮。Visual Studio 将根据您的说明生成一个新的控制台应用程序项目。这个过程可能需要一些时间。

4.安装 IronPDF 库

要在项目中利用 IronPDF 的功能,首先需要安装该库。有几种方法可以实现这一点,每种方法都适合不同的开发工作流程或偏好。以下是将 IronPDF 库安装到 Visual Studio 项目中的三种常用方法。

4.1 使用 NuGet 软件包管理器安装

Visual Studio 中的 NuGet 软件包管理器用户界面提供了一种浏览、选择和安装软件包的直接方法。

1.在 Visual Studio 中,导航到解决方案资源管理器中的项目,执行右键单击操作,然后选择 "管理 NuGet 包... "选项。

2.单击 "浏览 "选项卡并在搜索框中输入 "IronPDF"。

3.在搜索结果中找到 IronPDF 软件包,选择它,然后点击 "安装 "按钮。Visual Studio 将自动处理下载和安装。

Report .NET 与 IronPDF 的比较:图 5 - 通过在 NuGet 包管理器的搜索栏中搜索 "IronPdf",使用管理解决方案的 NuGet 包来安装 IronPDF,然后选择项目并单击安装按钮。

4.2 使用 NuGet 包管理器控制台安装

对于那些喜欢使用命令行工具的人来说,NuGet 软件包管理器控制台是一个强大的选择。

  1. 打开控制台:转到 Visual Studio 的 "工具 "菜单,然后导航到 "NuGet 包管理器">"包管理器控制台"。

    1. 安装命令:在控制台中键入以下命令并按 Enter:
Install-Package IronPdf

该命令指示 NuGet 下载最新版本的 IronPDF 并安装到项目中。

4.3 使用 NuGet 网站安装

如果您喜欢手动下载软件包或需要特定版本的 IronPDF,NuGet 网站是一个不错的选择。

  1. 访问 NuGet 网站:前往 nuget.org 并搜索 "IronPDF"。

  2. 下载软件包:从 IronPDF 页面选择所需的版本并下载 .nupkg 文件。

  3. 手动安装:下载完成后,可以手动将软件包添加到项目中。在 Visual Studio 中,转到 "工具 "菜单,然后转到 "选项">"NuGet 包管理器">"包源"。添加一个新源,指向下载 .nupkg 文件的文件夹。最后,使用 Visual Studio 中的 "软件包管理器用户界面 "或 "控制台 "从本地源安装软件包。

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,请按以下步骤操作:

  1. 打开项目:启动 Visual Studio 并打开要添加 Report.NET 的项目。

    1. 手动添加库:有几种方法可以在项目中包含该库:

      • 作为编译过的程序集:如果 GitHub 代码库中包含编译后的 DLL 文件,则只需在项目中添加对该 DLL 的引用即可。右键单击项目解决方案资源管理器中的 "引用",选择 "添加引用...",然后浏览并选择 DLL 文件。
    • 通过包含源文件:如果想直接包含源代码,或者没有提供编译后的 DLL,可以将源代码文件添加到项目中。在解决方案资源管理器中右键单击项目,选择 "添加">"现有项目...",然后导航到并选择从 ZIP 中提取的 Report.NET 源代码文件。
  2. 确保兼容性:确保您的项目采用 Report.NET 要求的兼容 .NET Framework 版本。

6.IronPDF 与 Report.NET C&num 的高级功能对比;

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")
VB   C#

6.1.1.2 HTML 文件转 PDF

同样,IronPDF 可将现有的 将 HTML 文件转换为 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")
VB   C#

Report .NET 与 IronPDF 之间的比较:图 6 - 使用 IronPDF 将 HTML 文件输出为 PDF

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")
VB   C#

Report .NET 与 IronPDF 之间的比较:图 7 - 使用 IronPDF 将 URL 转换为 PDF 的输出结果

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")
VB   C#

Report .NET 与 IronPDF 之间的比较:图 8 - 输出:使用 IronPDF 编辑现有 PDF

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")
VB   C#

Report .NET 与 IronPDF 的比较:图 9 - 输出 PDF:使用 IronPDF 生成 PDF 表单

6.1.5 合并 PDF 文档

您可以 合并多个 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")
VB   C#

Report .NET 与 IronPDF 的比较:图 10 - 输出 PDF:生成多个 PDF 文件并将它们合并为一个 PDF。

6.1.6 分割 PDF 文档

相反,IronPDF 可以 分割单一 PDF 多个文档。如果要分发单个页面或章节,可能需要这样做。

6.1.7 加密和解密 PDF 文件

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")
VB   C#

6.1.8 设置文档属性和元数据

有了这个库,就可以直接设置文档属性,如标题、作者和元数据。这有助于文档管理和组织。

using IronPdf;
using System;
var encryptedPdf = PdfDocument.FromFile("sample.pdf");
pdf.MetaData.Author = "Iron Developer";
pdf.MetaData.Keywords = "Confidential, Private";
pdf.MetaData.ModifiedDate = DateTime.Now;
pdf.SaveAs("modified.pdf");
using IronPdf;
using System;
var encryptedPdf = PdfDocument.FromFile("sample.pdf");
pdf.MetaData.Author = "Iron Developer";
pdf.MetaData.Keywords = "Confidential, Private";
pdf.MetaData.ModifiedDate = DateTime.Now;
pdf.SaveAs("modified.pdf");
Imports IronPdf
Imports System
Private encryptedPdf = PdfDocument.FromFile("sample.pdf")
pdf.MetaData.Author = "Iron Developer"
pdf.MetaData.Keywords = "Confidential, Private"
pdf.MetaData.ModifiedDate = DateTime.Now
pdf.SaveAs("modified.pdf")
VB   C#

6.1.9 符合 PDF/A 标准

IronPDF 可以 生成符合 PDF/A 标准的 需要长期存档和保存记录的文件。

6.1.10 使用 IronPDF 的 XML 报告

IronPDF 不支持将 XML 直接转换为 PDF,但一种可行的方法是先将 XML 数据转换为 HTML 格式。这是通过使用 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>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'<?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>
VB   C#

这就是我们的 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>
'INSTANT VB TODO TASK: The following line could not be converted:
<?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="/"> (Of html) (Of head) (Of title) Library Catalog</title> (Of style) body
If True Then
	font-family: Arial, sans-serif
	margin:
	20px
End If
					table
					If True Then
						border-collapse: collapse
						width:
						100 Mod 
					End If
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'					th, td
'					{
'						text-align: left;
'						padding:
'						8px;
'					}
					tr:
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'					nth-child(even)
'					{
'						background-color: #f2f2f2;
'					}
					th
					If True Then
						background-color: #4CAF50
						color:
						white
					End If
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'				</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>
VB   C#

下面的代码片段说明了我们如何处理这一逻辑:

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")
VB   C#

1.从 XSLT 样式表开始 (style.xslt) XSLT文件是XSLT的一部分,它决定了XML数据应如何被编排成HTML。.NET中的XslCompiledTransform类用于加载XSLT文件。

2.利用 XmlReader 加载 XML 数据 (data.xml). XmlReader 为此目的非常有效,因为它提供了 XML 数据的只读视图。

3.转换后的 HTML 将写入一个文件 (output.html) 使用 XmlWriter,配置为生成缩进的 HTML 以提高可读性,并省略 HTML 输出中不需要的 XML 声明。

4.HTML 文件准备就绪后,IronPDF 的 ChromePdfRenderer** 将用于将 HTML 文档转换为 PDF。该渲染器可模仿高质量的渲染引擎,确保生成的 PDF 能准确呈现 HTML 内容。

5.最后,PDF 文档会被保存到文件系统中 (报告.pdf).这一步结束了转换过程,生成了从原始 XML 数据衍生出来的 PDF 文档。

这就是我们使用 XML 和 IronPDF 生成报告的方法。我们生成的 PDF 输出文件:

Report .NET 与 IronPDF 之间的比较:图 11 - 使用 IronPDF 和 XSLT 从 XML 报告输出 PDF 文件

我们还可以通过编程创建 SAP 交互式报告,然后使用 IronPDF 进行转换。如需了解更多详细信息,请参阅本指南,了解 C# 报告生成.

6.2 Report.NET 的高级功能

报告.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
VB   C#

Report .NET 与 IronPDF 之间的比较:图 12 - 使用 Report.NET 在 PDF 文档中添加各种字体样式和大小

6.2.2 图像嵌入

利用图像示例功能,开发人员可将图像嵌入 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
VB   C#

Report .NET 与 IronPDF 的比较:图 13 - 输出 PDF:使用 Report.NET 在 PDF 文档中嵌入图像

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
VB   C#

Report .NET 与 IronPDF 的比较:图 14 - 输出 PDF:使用 Report.NET 为 PDF 文档添加列表

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
VB   C#

6.2.5 PDF 转自文本

PDF From Text 功能展示了该库在 PDF 中添加和自定义文本内容的功能。这包括设置文本对齐方式、行间距、颜色以及应用粗体或斜体等文本效果。

7.文件和支持

7.1 IronPDF

IronPDF 以其广泛的 详细文件.IronPDF 的文档部分条理清晰,包括设置说明、教程和 API 参考资料。这些指南的结构可帮助初学者和有经验的开发人员快速找到所需的信息。对于社区驱动的支持,开发人员可以求助于论坛和社区讨论。在这里,他们可以提出问题、分享经验并从其他用户那里找到答案。

IronPDF 还通过票务系统提供专业支持,工程师可以直接从 IronPDF 团队获得帮助。这项服务可能是付费许可的一部分,可提供更直接、更即时的帮助。

7.2 Report.NET

报告.NET作为一个开放源码库,.NET.COM 在文档和支持方面采用了不同的方法。文档内容可能不如商业库那么广泛,但足以帮助用户入门和处理常见任务。该库的文档可在 GitHub 存储库中找到,或作为源代码中的内联注释。文档往往更具技术性,可能需要深入挖掘才能找到所需信息。

由于 Report.NET 是一个免费的开源库,它不提供正式的专业支持。开发人员需要依靠社区的帮助,或者需要聘请专家来解决更深入的问题。

8.许可模式

Report .NET 与 IronPDF 的比较:图 15 - IronPDF for .NET 许可证信息

8.1 IronPDF 许可证模式

IronPDF提供多种 许可模式 以满足不同的开发和部署需求,确保适合各种规模的项目和组织。以下是概述:

  1. 精简版许可 (749美元):这是最基本的选项,适合在同一地点开发单个项目的个人开发者。它提供电子邮件支持,但不包括免版税再分发。

  2. Plus 许可 ($1,499 USD):该许可证面向小型团队,最多支持三名开发人员在三个地点为三个项目工作。它增强了支持功能,包括 24 小时电子邮件和聊天以及电话支持。

  3. 专业许可证 (2,999 美元):专为大型团队和项目设计,最多可容纳 10 名开发人员在 10 个地点为 10 个项目工作。它包括所有 Plus 支持选项,并增加了屏幕共享支持,以更互动的方式解决问题。

  4. 免费试用许可证:该版本是评估目的的理想选择。 试用许可 允许您免费试用 IronPDF。不过,它仅供私人使用,生成的 PDF 不应发布在任何公共或企业互联网或内联网项目上。

除核心许可证外,还有扩展许可证可供选择:

  • 免版税再分发:如果您需要将 IronPDF 包含在软件产品中进行分发或销售,则需要提供免版税再分发服务。SaaS 和 OEM 再分发的价格为 1,499 美元。
  • 扩展支持和更新:该附加功能可确保您获得持续的产品更新和支持。您可以选择 1 年或 5 年支持套餐,后者比年度套餐更省钱。

8.2 Report.NET 许可模式

Report.NET 根据 LGPL 许可免费发布。LGPL (较小通用公共许可证) LGPL 是一种自由软件许可证,允许用户运行、研究、共享和修改软件。该许可证确保 Report.NET 库可以在开源软件和专有软件中自由使用,只要不修改代码中 LGPL 许可的部分即可。如果进行了修改,这些修改必须在相同的许可证下共享。

9.结论

在研究 IronPDF报告.NET我们已经研究了各种因素,如它们的能力、提供的功能范围、易用性、支持服务以及许可方式。

IronPDF提供了一套丰富的功能,让开发人员不仅能从HTML、图像和文本中创建和编辑PDF文件,还能实现加密、数字签名和定制页眉/页脚等高级功能。它支持不同的许可方式,这意味着它可以满足从个人开发者到大型企业的不同规模的项目需求。全面的文档和专业的支持结构使其适用于需要持续更新和直接帮助的项目。IronPDF 还提供 免费试用 IronPDF 的起价为 749 美元。

相比之下,Report.NET 是一款擅长生成 PDF 文档的简单工具。它的 LGPL 许可证意味着开发人员可以在个人和商业项目中使用它,而不会受到很大的限制。虽然它可能无法提供与 IronPDF 相同的结构化支持,但 Report.NET 的开源性质鼓励社区投入和帮助。

您在IronPDFReport.NET之间的选择取决于您项目的具体需求。如果您的项目需要在专业支持下创建和处理详细的 PDF 文件,那么 IronPDF 可能是您的首选。

< 前一页
Compdfkit与IronPDF比较
下一步 >
C# 报告工具(功能比较)

准备开始了吗? 版本: 2024.10 刚刚发布

免费NuGet下载 总下载量: 11,108,738 查看许可证 >