如何使用 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);
根据要求,我的 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);