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
尝试在用户目录中创建 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 构建并彻底删除标志会更好。
以这种方式调用 chrome 可以正常工作,例如在带有 Visual Studio 的 IIS Express 上的本地开发环境中,但它会失败,即使在无头模式下,在运行 IIS 的服务器上,因为 IIS 用户没有被授予交互/桌面权限,并且chrome 抓取这个 PDF 的方式实际上需要交互/桌面权限。提供这些权限的方法很复杂,但在任何地方你都读到过如何以DON'T PROVIDE INTERACTIVE/DESKTOP PERMISSIONS开头。此外,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);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的 DDict 是我的另一个答案中的 GracefulDynamicDictionary。
https://www.nuget.org/packages/GracefulDynamicDictionary/
https://github.com/b9chris/GracefulDynamicDictionary
理想情况下,这将是异步的,因为对 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 都将无法使用。也就是说,看起来那些游说破坏它的人在 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
.
print-to-pdf 命令后我缺少“=”。
正确的命令是:
chrome --headless --disable-gpu --print-to-pdf="C:/temp/name.pdf" https://www.google.com/
Run Code Online (Sandbox Code Playgroud)
现在它正在发挥作用。
归档时间: |
|
查看次数: |
4075 次 |
最近记录: |