如何使用 C# 将 chrome 无头输出有效地输出到内存?

How to get chrome headless output to memory efficiently with C#?

根据要求,我的 ASP.NET 服务器应该使用 chrome 无头实例和 return 生成的 PDF 将 HTML 文件转换为 PDF。

CMD命令:

chrome --headless --disable-gpu --print-to-pdf-no-header --print-to-pdf="[pdf-file-path]" --no-margins "[html-file-path]"

处理 PDF 文件并非易事。服务器需要清理之前请求的 PDF 文件,需要检测新 PDF 何时创建,然后将文件读入内存。这一切都太慢了。

有更好的解决办法吗?我能以某种方式将文件直接放入内存吗?或者更好地管理 PDF 文件?

我会考虑几种选择。

将输出打印到 PostScript 打印机。

那就拿着PostScript说用GhostScript输出一个PDF吧

可能更好?使用 .net pdfSharp 库,然后使用一些代码根据该库呈现 HTML。

考虑一下:

https://www.nuget.org/packages/HtmlRenderer.PdfSharp/1.5.1-beta1

停止通过命令行界面使用 chrome,转而使用 Chrome C# 上的 Web 驱动程序,例如 Selenium 或 Puppeteer。对于 Selenium,使用以下 NuGet:

https://www.nuget.org/packages/Selenium.WebDriver/4.0.0-rc2

然后您可以使用以下代码将 HTML 打印成 PDF:

// Base 64 encode
var textBytes = Encoding.UTF8.GetBytes(html);
var b64Html = Convert.ToBase64String(textBytes);

// Create driver
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments(new List<string> { "no-sandbox", "headless", "disable-gpu" });
using var driver = new ChromeDriver(webdriverPath, chromeOptions);
// Little bit magic here. Refer to: 
driver.Navigate().GoToUrl("data:text/html;base64," + b64Html);

// Print
var printOptions = new Dictionary<string, object> {
    // Docs: https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF
    { "paperWidth", 210 / 25.4 },
    { "paperHeight", 297 / 25.4 },
};
var printOutput = driver.ExecuteChromeCommandWithResult("Page.printToPDF", printOptions) as Dictionary<string, object>;
var document = Convert.FromBase64String(printOutput["data"] as string);