在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#異步操作后臺(tái)運(yùn)行(backgroundworker類)示例
這篇文章主要介紹了c#異步操作后臺(tái)運(yùn)行(backgroundworker類)示例,需要的朋友可以參考下2014-04-04
C# 使用相同權(quán)限調(diào)用 cmd 傳入命令的方法
本文告訴大家如何使用相同權(quán)限調(diào)用cmd并且傳入命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07
在C#中實(shí)現(xiàn)文本與Word文檔互相轉(zhuǎn)換的操作步驟
在現(xiàn)代軟件開(kāi)發(fā)中,處理文檔內(nèi)容是一個(gè)非常常見(jiàn)的需求,無(wú)論是生成報(bào)告、存儲(chǔ)日志,還是處理用戶輸入,開(kāi)發(fā)者都可能需要在純文本與 Word 文檔之間進(jìn)行轉(zhuǎn)換,所以本文給大家介紹了如何在 C# 中將文本轉(zhuǎn)換為 Word 以及將 Word 轉(zhuǎn)換為文本,需要的朋友可以參考下2025-09-09
C#解決SQlite并發(fā)異常問(wèn)題的方法(使用讀寫鎖)
這篇文章主要介紹了C#解決SQlite并發(fā)異常問(wèn)題的方法,通過(guò)使用讀寫鎖達(dá)到多線程安全訪問(wèn),進(jìn)而解決SQLite并發(fā)異常的問(wèn)題,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析
在C#中,as?和?is?關(guān)鍵字都用于處理類型轉(zhuǎn)換的運(yùn)算符,但它們有不同的用途和行為,本文我們將詳細(xì)解釋這兩個(gè)運(yùn)算符的區(qū)別和用法,需要的朋友可以參考下2025-01-01
混合語(yǔ)言編程—C#使用原生的Directx和OpenGL繪圖的方法
本文要說(shuō)的是混合C#和C/C++語(yǔ)言編程,在C#的Winform和WPF下使用原生的Direct和OpenGL進(jìn)行繪圖2013-09-09

