我正在尝试使用Chrome的Headless功能将html转换为pdf。但是,我根本没有得到输出。控制台也不会显示任何错误。我在windows m / c中的命令下运行。
chrome --headless --disable-gpu --print-to-pdf
我尝试了各种各样的选择。什么都没有产生。我正在使用chrome版本60
答案 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
尝试在用户目录中创建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>
以这种方式调用chrome可以在带有Visual Studio的IIS Express上的本地开发环境中很好地工作,但即使在无头模式下,在运行IIS的服务器上也会失败,因为没有为IIS用户提供交互/桌面功能权限以及chrome抓取此PDF的方式实际上需要交互式/桌面权限。提供这些权限的方法很复杂,但是您在任何地方都以不要提供交互/桌面权限开始。此外,Chrome有一天会摆脱命令行的上述风险使工作变得更加艰辛,以使其无法自拔。
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