无头镀铬打印pdf

use*_*925 2 pdf google-chrome google-chrome-headless

我正在尝试使用Chrome的Headless功能将html转换为pdf.但是,我根本没有得到输出.控制台也不会显示任何错误.我在windows m/c中运行命令.

chrome --headless --disable-gpu --print-to-pdf

我尝试了各种各样的选择.什么都没有产生.我有60版铬

Chr*_*ini 11

命令行 --print-to-pdf

默认情况下,--print-to-pdf尝试在用户目录中创建 PDF。默认情况下,该用户目录是存储实际 chrome 二进制文件的位置,它是您正在运行的版本的特定版本文件夹 - 例如,“C:\Program Files (x86)\Google\Chrome\Application\61.0. 3163.100"。而且,默认情况下... Chrome 不允许写入此文件夹。您可以通过添加--enable-logging到您的命令来观察它的尝试和失败。

所以不幸的是,默认情况下,这个命令会失败。*

您可以通过在参数中提供一个路径来解决这个问题,Chrome 可以在其中写入 - 比如

--print-to-pdf="C:\Users\Jane\test.pdf"
Run Code Online (Sandbox Code Playgroud)

或者,您可以更改用户目录:

--user-data-dir="C:\Users\Jane"
Run Code Online (Sandbox Code Playgroud)

您可能更喜欢更改用户目录的原因之一是,如果您希望 PDF 自动从网页接收其名称;Chrome 查看标题标签,然后将其转储为<title>My Page</title>=>My-Page.pdf

*我认为这种默认行为非常令人困惑,应该作为针对 Chrome 的错误提交。然而,显然 Chrome 团队的一部分完全反对仅仅存在这个命令行选项,而是相信强制每个人使用它来获得与 Puppeteer 一起使用的 node.js 构建并彻底删除标志会更好。

Windows 上的命令行限制

以这种方式调用 chrome 可以正常工作,例如在带有 Visual Studio 的 IIS Express 上的本地开发环境中,但它会失败,即使在无头模式下,在运行 IIS 的服务器上,因为 IIS 用户没有被授予交互/桌面权限,并且chrome 抓取这个 PDF 的方式实际上需要交互/桌面权限。提供这些权限的方法很复杂,但在任何地方你都读到过如何以DON'T PROVIDE INTERACTIVE/DESKTOP PERMISSIONS开头。此外,Chrome 有一天会摆脱命令行的上述风险使得工作更加努力,使其工作成为一个不确定的命题。

chrome 命令行的替代方案

wkhtmltopdf

Chrome 在幕后只是使用wkhtmltopdf。我还没有尝试过,但这很可能会完成工作。一个小风险是在 Chrome 中生成 PDF 时,测试很明显:在 Chrome 中查看页面。如果您感到紧张,请打开打印预览。在 wkhtmltopdf 中,它实际上是 Chromium 的不同版本,这可能会产生渲染差异。也许。

另一种选择是领先于希望摆脱--print-to-pdf并使用浏览器开发 API(通过 Selenium)的团队,因为他们喜欢。**

private static void pdfSeleniumImpl(string url, string pdfPath)
{
    var options = new OpenQA.Selenium.Chrome.ChromeOptions();
    options.AddArgument("headless");

    using (var chrome = new OpenQA.Selenium.Chrome.ChromeDriver(options))
    {
        chrome.Url = url;

        var printToPdfOpts = new Dictionary<string, object>();
        var resultDict = (Dictionary<string, object>)
            chrome.ExecuteChromeCommandWithResult(
                "Page.printToPDF", printToPdfOpts);
        dynamic result = new DDict(resultDict);
        string data = result.data;
        var pdfFile = Convert.FromBase64String(data);
        System.IO.File.WriteAllBytes(pdfPath, pdfFile);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的 DDict 是我的另一个答案中的 GracefulDynamicDictionary。

https://www.nuget.org/packages/GracefulDynamicDictionary/

https://github.com/b9chris/GracefulDynamicDictionary

/sf/answers/1693476291/

理想情况下,这将是异步的,因为对 Selenium 的所有调用实际上都是网络命令,并且写入该文件可能会占用大量磁盘 IO。Chrome 返回的数据实际上也是一个 Stream。然而不幸的是,Selenium 的常规使用库根本不使用异步,因此需要升级该库或为 .Net 确定一个可靠的异步 Selenium 库才能真正做到这一点。

https://github.com/puppeteer/puppeteer/blob/master/lib/Page.js#L1007

https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF

** Page.pdfchrome Dev API 命令也已弃用,因此,如果该特遣队获得成功,则命令行和 Dev API 都将无法使用。也就是说,看起来那些游说破坏它的人在 2 年前放弃了。

  • “*在幕后 Chrome 仅使用 wkhtmltopdf。*” - 需要引用。 (2认同)

小智 6

这是有效的:

chrome --headless --disable-gpu --print-to-pdf=file1.pdf https://www.google.co.in/
Run Code Online (Sandbox Code Playgroud)

在文件夹中创建文件:C:\Program Files (x86)\Google\Chrome\Application\61.0.3163.100.


Dob*_*tov 5

不要忘记以管理员权限打开您的终端机/ cmd :)否则,它根本不会保存文件。


use*_*925 2

print-to-pdf 命令后我缺少“=”。

正确的命令是:

chrome --headless --disable-gpu --print-to-pdf="C:/temp/name.pdf" https://www.google.com/
Run Code Online (Sandbox Code Playgroud)

现在它正在发挥作用。