在C#中生成PDF的步驟詳解
此分步教程展示了如何使用 DotNetBrowser 在 C# 中生成 PDF 文件。
在 .NET 世界中,存在許多 PDF 庫(kù)。但我們發(fā)現(xiàn),使用集成瀏覽器生成 PDF 更為簡(jiǎn)單。由于 DotNetBrowser 可以在完全脫離屏幕的情況下工作,因此無(wú)論是在 Windows 還是 Linux 的服務(wù)器上,您都可以使用它。
算法很簡(jiǎn)單:
- 加載頁(yè)面。
- 填充頁(yè)面數(shù)據(jù)。
- 配置打印機(jī)。
- 將頁(yè)面打印為 PDF。
步驟 1: 創(chuàng)建項(xiàng)目
對(duì)于我們的任務(wù),我們不需要用戶界面。因此,我們創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序。
打開(kāi)終端或命令提示符,導(dǎo)航到所需的目錄,并運(yùn)行以下命令:
dotnet new console -o PdfGeneration
步驟 2: 集成 DotNetBrowser
將目錄更改為 PdfGeneration 并從 NuGet 添加 DotNetBrowser 包:
# 對(duì)于 Windows 平臺(tái): dotnet add package DotNetBrowser # 對(duì)于其他平臺(tái): dotnet add package DotNetBrowser.Linux-x64 dotnet add package DotNetBrowser.Linux-arm64 dotnet add package DotNetBrowser.macOS-x64 dotnet add package DotNetBrowser.macOS-arm64
之后, 獲取您的免費(fèi)許可證以開(kāi)始使用 DotNetBrowser。
步驟 3: 加載頁(yè)面
創(chuàng)建一個(gè)簡(jiǎn)單的控制臺(tái)應(yīng)用程序,以啟動(dòng) DotNetBrowser 并加載帶有模板的頁(yè)面。
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();
// 頁(yè)面是項(xiàng)目中的一個(gè)資源。
var pageUrl = Path.GetFullPath("template.html");
await browser.Navigation.LoadUrl(pageUrl);
}
}
這是一個(gè)在常規(guī)瀏覽器中加載的普通頁(yè)面。因此,您可以利用任何 JavaScript 庫(kù)(如 plotly.js 或 D3.js)、WebGL、SVG 圖形、或者 Chromium 中可用的其他任何技術(shù)。
步驟 4: 填充頁(yè)面數(shù)據(jù)
要填充頁(yè)面數(shù)據(jù),請(qǐng)使用 DOM API 或執(zhí)行任何 JavaScript 代碼。我們將使用嵌入到頁(yè)面中的幾個(gè) JavaScript 函數(shù):
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: 配置打印設(shè)置
指示瀏覽器自動(dòng)打印,并配置打印參數(shù):
private static TaskCompletionSource<string> ConfigurePrinting(IBrowser browser)
{
// 指示瀏覽器自動(dòng)打印,而不是顯示打印預(yù)覽。
browser.RequestPrintHandler =
new Handler<RequestPrintParameters, RequestPrintResponse>(
p => RequestPrintResponse.Print()
);
TaskCompletionSource<string> whenCompleted = new();
// 當(dāng)瀏覽器打印 HTML 頁(yè)面時(shí)。
browser.PrintHtmlContentHandler =
new Handler<PrintHtmlContentParameters, PrintHtmlContentResponse>(
parameters =>
{
// 使用 PDF 打印機(jī)。
var printer = parameters.Printers.Pdf;
var job = printer.PrintJob;
// 為 PDF 文件生成隨機(jī)名稱。
var guid = Guid.NewGuid().ToString();
var path = Path.GetFullPath($"{guid}.pdf");
job.Settings.PdfFilePath = path;
// 去除邊緣的空白區(qū)域。
job.Settings.PageMargins = PageMargins.None;
// 移除瀏覽器默認(rèn)的頁(yè)眉和頁(yè)腳。
job.Settings.PrintingHeaderFooterEnabled = false;
job.PrintCompleted += (_, _) => whenCompleted.SetResult(path);
// 繼續(xù)打印。
return PrintHtmlContentResponse.Print(printer);
});
return whenCompleted;
}
步驟 6: 生成 PDF 文件
整合以上步驟,開(kāi)始打印并等待完成:
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;
}
結(jié)果
運(yùn)行程序:
dotnet run
打開(kāi)生成的 PDF 文件

C# 中由 DotNetBrowser 生成的 PDF 文件
到此這篇關(guān)于在C#中生成PDF的步驟詳解的文章就介紹到這了,更多相關(guān)C#生成PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用FluentScheduler實(shí)現(xiàn)觸發(fā)定時(shí)任務(wù)
FluentScheduler是.Net平臺(tái)下的一個(gè)自動(dòng)任務(wù)調(diào)度組件,這篇文章主要為大家詳細(xì)介紹了C#如何使用FluentScheduler實(shí)現(xiàn)觸發(fā)定時(shí)任務(wù),感興趣的小伙伴可以了解下2023-12-12
C#中Byte轉(zhuǎn)換相關(guān)的函數(shù)
這篇文章主要介紹了C#中Byte轉(zhuǎn)換相關(guān)的函數(shù)介紹,非常具有參考借鑒價(jià)值,特此分享到腳本之家平臺(tái)供大家學(xué)習(xí)2016-05-05
C# WPF 建立無(wú)邊框(標(biāo)題欄)的登錄窗口的示例
這篇文章主要介紹了C# WPF 建立無(wú)邊框(標(biāo)題欄)的登錄窗口的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12
C#實(shí)現(xiàn)Word轉(zhuǎn)為PDF的方法
今天小編就為大家分享一篇關(guān)于C#實(shí)現(xiàn)Word轉(zhuǎn)為PDF的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
C# 無(wú)需COM組件創(chuàng)建快捷方式的實(shí)現(xiàn)代碼
做一個(gè)小程序, 需要?jiǎng)?chuàng)建快捷方式, 網(wǎng)上普遍的做法是引入 COM 組件, 雖然也挺方便的, 但引入之后, 程序就需要多帶一個(gè) dll 文件, 這樣, 想做成單文件便攜版就不行了2011-05-05
Unity shader實(shí)現(xiàn)移動(dòng)端模擬深度水效果
這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)移動(dòng)端模擬深度水效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
C#實(shí)現(xiàn)winform自動(dòng)關(guān)閉MessageBox對(duì)話框的方法
這篇文章主要介紹了C#實(shí)現(xiàn)winform自動(dòng)關(guān)閉MessageBox對(duì)話框的方法,實(shí)例分析了C#中MessageBox對(duì)話框的相關(guān)操作技巧,需要的朋友可以參考下2015-04-04
基于C#動(dòng)手實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù)器Web Server
這篇文章主要為大家詳細(xì)介紹了基于C#動(dòng)手實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù)器Web Server,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

