很遗憾wkhtmltopdf
不处理复杂网站的下载,因为它使用 Qt/QtWebKit 库,这似乎有一些问题。
一个问题是wkhtmltopdf
不支持相对地址(GitHub:#1634 https://github.com/wkhtmltopdf/wkhtmltopdf/issues/1634, #1886 https://github.com/wkhtmltopdf/wkhtmltopdf/issues/1886, #2359 https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359, QTBUG-46240 https://bugreports.qt.io/browse/QTBUG-46240) 例如:
<img src="/images/filetypes/txt.png">
<script src="//cdn.optimizely.com/js/653710485.js">
并将它们加载为本地。我发现的一种解决方案是通过以下方式就地纠正 html 文件ex
就地编辑器:
ex -V1 page.html <<-EOF
%s,'//,'http://,ge
%s,"//,"http://,ge
%s,'/,'http://www.example.com/,ge
%s,"/,"http://www.example.com/,ge
wq " Update changes and quit.
EOF
但是,它不适用于远程上具有此类 URL 的文件。
另一个问题是它不处理丢失的资源。您可以尝试指定--load-error-handling ignore
,但在大多数情况下它不起作用(参见#2051 https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2051),所以这仍然是突出的。解决方法是在转换之前简单地删除这些无效资源。
或者wkhtmltopdf
,您可以使用htmldoc
, PhantomJS http://phantomjs.org/使用一些附加脚本,例如使用光栅化.js https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js:
phantomjs rasterize.js http://example.com/
or dompdf https://github.com/dompdf/dompdf(PHP 的 HTML 到 PDF 转换器,您可以通过 Composer 安装)示例代码如下:
<?php
// somewhere early in your project's loading, require the Composer autoloader
// see: http://getcomposer.org/doc/00-intro.md
$HOMEDIR = "/Users/foo";
require $HOMEDIR . '/.composer/vendor/autoload.php';
// disable DOMPDF's internal autoloader if you are using Composer
define('DOMPDF_ENABLE_AUTOLOAD', FALSE);
define('DOMPDF_ENABLE_REMOTE', TRUE);
// include DOMPDF's default configuration
require_once $HOMEDIR . '/.composer/vendor/dompdf/dompdf/dompdf_config.inc.php';
$htmlString = file_get_contents("https://example.com/foo.pdf");
$dompdf = new DOMPDF();
$dompdf->load_html($htmlString);
$dompdf->render();
$dompdf->stream("sample.pdf");