Ответ 1
К сожалению, wkhtmltopdf
не обрабатывает загрузку сложных веб-сайтов, потому что он использует библиотеку Qt/QtWebKit, которая, похоже, имеет некоторые проблемы.
Одна из проблем заключается в том, что wkhtmltopdf
не поддерживает относительные адреса (GitHub: # 1634, # 1886, # 2359, 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), так что это все еще выдающееся. Обходным путем является просто удалить эти недопустимые ресурсы перед преобразованием.
В качестве альтернативы wkhtmltopdf
вы можете использовать htmldoc
, PhantomJS с помощью дополнительного script, например, используя rasterize.js:
phantomjs rasterize.js http://example.com/
или dompdf (конвертер HTML в PDF для PHP, вы можете установить композитором) с примером кода ниже:
<?php
// somewhere early in your project loading, require the Composer autoloader
// see: http://getcomposer.org/doc/00-intro.md
$HOMEDIR = "/Users/foo";
require $HOMEDIR . '/.composer/vendor/autoload.php';
// disable DOMPDF internal autoloader if you are using Composer
define('DOMPDF_ENABLE_AUTOLOAD', FALSE);
define('DOMPDF_ENABLE_REMOTE', TRUE);
// include DOMPDF 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");