在C#中生成PDF的步骤详解

 更新时间:2024年10月31日 08:30:13   作者:TeamDev  
在 .NET 世界中,存在许多 PDF 库,但我们发现,使用集成浏览器生成 PDF 更为简单,由于 DotNetBrowser 可以在完全脱离屏幕的情况下工作,本文给大家介绍了如何在 C# 中生成 PDF,需要的朋友可以参考下

此分步教程展示了如何使用 DotNetBrowserC# 中生成 PDF 文件。

在 .NET 世界中,存在许多 PDF 库。但我们发现,使用集成浏览器生成 PDF 更为简单。由于 DotNetBrowser 可以在完全脱离屏幕的情况下工作,因此无论是在 Windows 还是 Linux 的服务器上,您都可以使用它。

算法很简单:

  • 加载页面。
  • 填充页面数据。
  • 配置打印机。
  • 将页面打印为 PDF。

步骤 1: 创建项目

对于我们的任务,我们不需要用户界面。因此,我们创建一个控制台应用程序。

打开终端或命令提示符,导航到所需的目录,并运行以下命令:

dotnet new console -o PdfGeneration

步骤 2: 集成 DotNetBrowser

将目录更改为 PdfGeneration 并从 NuGet 添加 DotNetBrowser 包:

# 对于 Windows 平台:
dotnet add package DotNetBrowser

# 对于其他平台:
dotnet add package DotNetBrowser.Linux-x64
dotnet add package DotNetBrowser.Linux-arm64
dotnet add package DotNetBrowser.macOS-x64
dotnet add package DotNetBrowser.macOS-arm64

之后, 获取您的免费许可证以开始使用 DotNetBrowser。

步骤 3: 加载页面

创建一个简单的控制台应用程序,以启动 DotNetBrowser 并加载带有模板的页面。

class Program
{
    private static async Task Main()
    {
        var options = new EngineOptions.Builder
        {
            RenderingMode = RenderingMode.OffScreen,
            LicenseKey = "您的许可证密钥"
        }.Build();

        using var engine = EngineFactory.Create(engineOptions);
        using var browser = engine.CreateBrowser();

        // 页面是项目中的一个资源。
        var pageUrl = Path.GetFullPath("template.html");   
        await browser.Navigation.LoadUrl(pageUrl);
    }
}

这是一个在常规浏览器中加载的普通页面。因此,您可以利用任何 JavaScript 库(如 plotly.js 或 D3.js)、WebGL、SVG 图形、或者 Chromium 中可用的其他任何技术。

步骤 4: 填充页面数据

要填充页面数据,请使用 DOM API 或执行任何 JavaScript 代码。我们将使用嵌入到页面中的几个 JavaScript 函数:

private static void FillInData(IBrowser browser)
{
    var accountNumber = "123-4567";
    var name = "李白";
    var address = "1640 河滨大道";
    var reportingPeriod = "1985 年 10 月 25 日至 11 月 25 日";
    browser.MainFrame.ExecuteJavaScript(
        $"setBillInfo('{accountNumber}', '{name}', '{address}', '{reportingPeriod}')"
    );

    var dayCost = 500; // 美元。
    var dayUsage = 1.21; // 吉瓦特。
    var nightCost = 312;
    var nightUsage = 88;

    browser.MainFrame.ExecuteJavaScript(
        $"addCharge('Day Tariff', {dayUsage}, {dayCost});" +
        $"addCharge('Night Tariff', {nightUsage}, {nightCost});"
    );
}

步骤 5: 配置打印设置

指示浏览器自动打印,并配置打印参数:

private static TaskCompletionSource<string> ConfigurePrinting(IBrowser browser)
{
    // 指示浏览器自动打印,而不是显示打印预览。
    browser.RequestPrintHandler = 
        new Handler<RequestPrintParameters, RequestPrintResponse>(
            p => RequestPrintResponse.Print()
        );

    TaskCompletionSource<string> whenCompleted = new();
    // 当浏览器打印 HTML 页面时。
    browser.PrintHtmlContentHandler = 
        new Handler<PrintHtmlContentParameters, PrintHtmlContentResponse>(
            parameters =>
            {
                // 使用 PDF 打印机。
                var printer = parameters.Printers.Pdf;
                var job = printer.PrintJob;
    
                // 为 PDF 文件生成随机名称。
                var guid = Guid.NewGuid().ToString();
                var path = Path.GetFullPath($"{guid}.pdf");
                job.Settings.PdfFilePath = path;
    
                // 去除边缘的空白区域。
                job.Settings.PageMargins = PageMargins.None;
                // 移除浏览器默认的页眉和页脚。
                job.Settings.PrintingHeaderFooterEnabled = false;
                job.PrintCompleted += (_, _) => whenCompleted.SetResult(path);

                // 继续打印。
                return PrintHtmlContentResponse.Print(printer);
            });
    return whenCompleted;
}

步骤 6: 生成 PDF 文件

整合以上步骤,开始打印并等待完成:

private static async Task Main()
{
    var engineOptions = new EngineOptions.Builder
    {
        RenderingMode = RenderingMode.OffScreen,
        LicenseKey = "您的许可证密钥"
    }.Build();

    using var engine = EngineFactory.Create(engineOptions);
    using var browser = engine.CreateBrowser();
    
    await browser.Navigation.LoadUrl(Path.GetFullPath("template.html"));
    
    FillInData(browser);
    var whenPrintCompleted = ConfigurePrinting(browser);
    browser.MainFrame.Print();
    var resultPath = await whenPrintCompleted.Task;
}

结果

运行程序:

dotnet run

打开生成的 PDF 文件

C# 中由 DotNetBrowser 生成的 PDF 文件

到此这篇关于在C#中生成PDF的步骤详解的文章就介绍到这了,更多相关C#生成PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 英语单词state与status的区别

    英语单词state与status的区别

    state倾向于condition,是一种延续性的状态。status常用于描述一个过程中的某阶段(phase),类似于C语言中枚举型变量某一个固定的值,这个值属于一个已知的集合。这篇文章主要介绍了英语单词state与status的区别,需要的朋友可以参考下
    2016-11-11
  • c#异步操作后台运行(backgroundworker类)示例

    c#异步操作后台运行(backgroundworker类)示例

    这篇文章主要介绍了c#异步操作后台运行(backgroundworker类)示例,需要的朋友可以参考下
    2014-04-04
  • C#常用的数据格式转换汇总

    C#常用的数据格式转换汇总

    这篇文章介绍了C#常用的数据格式转换,有需要的朋友可以参考一下
    2013-10-10
  • C#自定义Key类型的字典无法序列化的解决方案详解

    C#自定义Key类型的字典无法序列化的解决方案详解

    当我们使用System.Text.Json.JsonSerializer对一个字典对象进行序列化的时候,默认情况下字典的Key不能是一个自定义的类型,本文整理了几种解决方案,希望对大家有所帮助
    2024-03-03
  • C# 使用相同权限调用 cmd 传入命令的方法

    C# 使用相同权限调用 cmd 传入命令的方法

    本文告诉大家如何使用相同权限调用cmd并且传入命令,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-07-07
  • 在C#中实现文本与Word文档互相转换的操作步骤

    在C#中实现文本与Word文档互相转换的操作步骤

    在现代软件开发中,处理文档内容是一个非常常见的需求,无论是生成报告、存储日志,还是处理用户输入,开发者都可能需要在纯文本与 Word 文档之间进行转换,所以本文给大家介绍了如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本,需要的朋友可以参考下
    2025-09-09
  • C#解决SQlite并发异常问题的方法(使用读写锁)

    C#解决SQlite并发异常问题的方法(使用读写锁)

    这篇文章主要介绍了C#解决SQlite并发异常问题的方法,通过使用读写锁达到多线程安全访问,进而解决SQLite并发异常的问题,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • Unity3D中脚本的执行顺序和编译顺序

    Unity3D中脚本的执行顺序和编译顺序

    在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行。与脚本有关的也就是编译和执行啦,本文就来研究一下Unity中脚本的编译和执行顺序的问题。
    2014-11-11
  • C# as 和 is 运算符区别和用法示例解析

    C# as 和 is 运算符区别和用法示例解析

    在C#中,as 和 is 关键字都用于处理类型转换的运算符,但它们有不同的用途和行为,本文我们将详细解释这两个运算符的区别和用法,需要的朋友可以参考下
    2025-01-01
  • 混合语言编程—C#使用原生的Directx和OpenGL绘图的方法

    混合语言编程—C#使用原生的Directx和OpenGL绘图的方法

    本文要说的是混合C#和C/C++语言编程,在C#的Winform和WPF下使用原生的Direct和OpenGL进行绘图
    2013-09-09

最新评论