当前位置: 首页 > 知识库问答 >
问题:

无头Chrome打印pdf

夏侯阳
2023-03-14

我正在尝试使用Chrome的Headless功能将html转换为PDF。然而,我根本得不到输出。控制台也不显示任何错误。我正在我的windows M/C中运行以下命令。

chrome--无头--禁用GPU--打印到PDF

我试过了所有的选择。没有生成任何内容。我用的是chrome版本60

共有2个答案

南门烈
2023-03-14

这是起作用的:

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

潘学民
2023-03-14

默认情况下,--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查看标题标签,然后像my page=>my-page.pdf那样转储它

*我认为这个默认行为是超级混乱的,应该作为针对Chrome的bug归档。然而,显然Chrome团队的一部分人完全反对这个命令行选项的存在,相反,他们认为最好是强迫所有使用它的人都得到一个node.js构建,使用Puppeteer并彻底删除该标志。

以这种方式调用chrome可以很好地工作,例如在带有Visual Studio的IIS Express上的本地开发环境中,但在运行IIS的服务器上,即使在无头模式下也会失败,因为IIS用户没有被授予交互/桌面权限,而chrome获取此PDF的方式实际上需要交互/桌面权限。提供这些权限有很多复杂的方法,但是你读到的任何地方都不能提供交互式/桌面权限。此外,Chrome有朝一日可能会取消命令行,这使得要使它正常工作变得更加困难,这是一个不确定的命题。

在幕后,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);
    }
}

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

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

https://github.com/b9chris/GracefulDynamicDictionary

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

理想情况下,这将是异步的,因为对Selenium的所有调用实际上都是网络命令,并且写入该文件可能会占用大量磁盘IO。从Chrome返回的数据实际上也是一个流。然而,不幸的是,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都将无法工作。这就是说,那些游说破坏它的人似乎在两年前就放弃了。

 类似资料:
  • 我再需要一次帮助。我正在尝试用Chrome的无头功能打印一页到pdf。但是,页眉和页脚在PDF中是存在的。我发现这个选项已经在devtools中实现了。 https://chromedevtools.github.io/devtools-protocol/tot/page/#method-printtopdf 但是,我找不到如何在CLI中使用这些选项。是否可以从Selenium调用Devtools

  • 问题内容: 我正在尝试让Google Chrome浏览器执行分页符。 通过一堆在chrome中有效的网站已经告诉我,但即使有一个非常简单的示例,我似乎也无法使其正常工作。使用chrome打印时,有什么方法可以强制分页? 问题答案: 我已经在包括Chrome在内的所有主要浏览器中成功使用了以下方法: 这是一个简化的示例。在实际代码中,每个页面div包含更多元素。

  • 问题内容: 我正在尝试使用chrome打印一个PHP生成的文档,在浏览器上看起来不错,链接到我要打印的页面,但是我的打印机无法打印任何彩色背景,请问有人可以提供任何建议吗?我可以用CSS做到这一点吗? 问题答案: 您可以在浏览器中调整是否打印背景颜色和图像。查看浏览器的打印选项。 GoogleChrome从26版(2013年3月)开始提供此功能。 同样从版本17开始,Chrome允许通过在元素CS

  • 如标题所示,我们的网络服务器经常向用户返回pdf报告。当他们查看pdf报表时,他们通常使用Chrome中的Ctrl P来打印它。 问题是当用chrome打印pdf时,它总是切断pdf页面的页眉和页脚(~0.45厘米或0.1771654英寸)。 你们可以在这篇文章的底部看到这张图片,当我们按下“打印”按钮时,两个红色矩形中的所有内容都将丢失(尽管它在打印预览中显示良好)。 我搜索了关键字"Chrom

  • 题目链接 牛客网 题目描述 从尾到头反过来打印出每个结点的值。 解题思路 1. 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 // java public ArrayList printListFro

  • 例子 $ gcc -v foo.c ... ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/include" #incl