无头镀铬打印pdf

时间:2017-09-06 11:39:21

标签: google-chrome pdf google-chrome-headless

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

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

我尝试了各种各样的选择。什么都没有产生。我正在使用chrome版本60

7 个答案:

答案 0 :(得分:6)

这是有效的:

chrome --headless --disable-gpu --print-to-pdf=file1.pdf https://www.google.co.in/

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

通过suraj扩展了非常简单的答案,我在源代码路径中创建了一个小函数,因此它就像一个CLI工具:

function webtopdf(){
    chromium-browser --headless --disable-gpu --print-to-pdf=$2 $1
}

快点

webtopdf https://goo.com/some-article some-article.pdf

现在为我做的工作

答案 3 :(得分:1)

我失踪了" ="在print-to-pdf命令之后。

正确的命令是:

chrome --headless --disable-gpu --print-to-pdf="C:/temp/name.pdf" https://www.google.com/

现在它正在运作。

答案 4 :(得分:1)

命令行--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"

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

--user-data-dir="C:\Users\Jane"

您可能希望更改用户目录的一个原因是,如果您希望PDF自动从网页中接收其名称,请执行以下操作: Chrome浏览器会查看标题标签,然后像<title>My Page</title> => My-Page.pdf

一样转储它

**我认为此默认行为非常令人困惑,应将其作为针对Chrome的错误进行归档。但是,显然,Chrome团队的一部分完全反对仅此命令行选项的存在,相反,认为最好强迫每个使用此命令行选项的人都使node.js构建与Puppeteer一起使用,并彻底删除该标志。 / p>

Windows上命令行的限制

以这种方式调用chrome可以在带有Visual Studio的IIS Express上的本地开发环境中很好地工作,但即使在无头模式下,在运行IIS的服务器上也会失败,因为没有为IIS用户提供交互/桌面功能权限以及chrome抓取此PDF的方式实际上需要交互式/桌面权限。提供这些权限的方法很复杂,但是您在任何地方都以不要提供交互/桌面权限开始。此外,Chrome有一天会摆脱命令行的上述风险使工作变得更加艰辛,以使其无法自拔。

Chrome命令行的替代

wkhtmltopdf

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

另一种替代方法是领先于希望摆脱--print-to-pdf的小组,并根据自己的喜好使用浏览器dev 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);
    }
}

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

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

https://github.com/b9chris/GracefulDynamicDictionary

https://stackoverflow.com/a/24192518/176877

理想情况下,这将是异步的,因为对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.pdf chrome Dev API命令也已被弃用,因此,如果该临时任务成功了,则命令行和Dev API均将不起作用。也就是说,看起来那些游说破坏了它两年前就放弃了。

答案 5 :(得分:0)

当前,该功能仅适用于Linux和Mac OS。

答案 6 :(得分:0)

这在Windows中对我有用

  

启动chrome --headless --disable-gpu   --print-to-pdf = C:\ Users \ username \ pdfs \ chrome.pdf --no-margins https://www.google.com