PrintToPDF无法在无头Chrome 60中使用

时间:2017-06-11 05:13:26

标签: node.js google-chrome pdf-generation google-chrome-devtools centos7

我正在尝试通过无头Chrome进行PDF打印。这是我正在处理的错误:

  

(node:6761)UnhandledPromiseRejectionWarning:未处理的承诺   拒绝(拒绝ID:1):错误:PrintToPDF未实施

Node.js包:

html-pdf-chrome

依赖关系:

✔ "chrome-remote-interface": "^0.23.1"  (v0.23.2 installed)   
✔ Chrome 59  (v60 beta installed)

驱动程序脚本:

const htmlPdf = require('html-pdf-chrome');
const html = '<p>Hello, world!</p>';
const options = {
    port: 9222, // port Chrome is listening on
};
htmlPdf.create(html, options).then((pdf) => pdf.toFile('test.pdf'));

Chrome 60已安装并以无头模式运行:

> google-chrome --version
Google Chrome 60.0.3112.24 beta

我已经跟踪调用Page.printToPDF的代码部分,这是引发错误的地方:

const CDP = require("chrome-remote-interface");
...
const { Page } = client;
...
// https://chromedevtools.github.io/debugger-protocol-viewer/tot/Page/#method-printToPDF
const pdf = yield Page.printToPDF(options.printOptions);

我能够毫不失败地执行其他广告功能,例如Page.captureScreenshot

如何让Page.printToPDF按宣传方式执行?

1 个答案:

答案 0 :(得分:3)

以下是我在PHP中创建无头Chrome命令以在apache用户下运行Chrome的方式:

private $headlessChromeCmd = [
    '$(which google-chrome)',
    '--headless',
    '--disable-gpu',
    '--hide-scrollbars',
    '--remote-debugging-port=%u',
    '--no-first-run',
    '--safebrowsing-disable-auto-update',
    '--disable-background-networking',
    //'--disable-extensions', <-- This was the problem
    '--disable-translate',
    '--disable-sync'
];

...

// Launch Chrome in a non-blocking background process
$cmd = sprintf(implode(' ', $this->headlessChromeCmd), $port) . ' < /dev/null >"'. $this->chromeStdoutFile . '" 2>&1 & echo $!;';

// For brevity without capturing stdout, stderr nor response codes
shell_exec($cmd);

CLI参数--disable-extensions是罪魁祸首。 Chrome生成PDF所需的PDF查看器是此参数禁用的扩展程序之一。神秘解决了。