Как бороться с ContentNotFoundError при использовании wkhtmltopdf?

Может ли кто-нибудь сказать мне, как решить следующие проблемы?

  • wkhtmltopdf не имеет возможности передавать информацию прокси-сервера (-p или -proxy) в отличие от предыдущих версий и не использовать также переменную $http_proxy и $https_proxy env.

  • wkhtmltopdf не работает с HTTPS/SSL, хотя я установил LD_LIBRARY_PATH для libssl.so и libcrypto.so

    [[email protected] ~]$ wkhtmltopdf https://www.google.co.in google.pdf
    loaded the Generic plugin 
    Loading page (1/2)
    Error: Failed loading page https://www.google.co.in (sometimes it will work just to ignore this error with --load-error-handling ignore)
    Exit with code 1 due to network error: UnknownNetworkError
    

    и

    [[email protected] ~]$ wkhtmltoimage https://www.google.co.in sample.jpg
    loaded the Generic plugin 
    Loading page (1/2)
    Error: Failed loading page https://www.google.co.in (sometimes it will work just to ignore this error with --load-error-handling ignore)
    Exit with code 1 due to network error: UnknownNetworkError
    
  • wkhtmltopdf работает частично с HTTP. В выходных файлах pdf отсутствует некоторый контент/фон/позиции.

    [[email protected] ~]$ wkhtmltopdf http://localhost:8880/ sample.pdf
    loaded the Generic plugin 
    Loading page (1/2)
    Printing pages (2/2)                                               
    Done                                                           
    Exit with code 1 due to network error: ContentNotFoundError
    
    [[email protected] ~]$ wkhtmltoimage http://localhost:8880/ sample.jpg
    loaded the Generic plugin 
    Loading page (1/2)
    Rendering (2/2)                                                    
    Done                                                               
    Exit with code 1 due to network error: ContentNotFoundError
    

Примечание: Im использует wkhtmltopdf-0.12.1-1.fc20.x86_64 и qt-4.8.6-10.fc20.x86_64

Ответ 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");

Ответ 2

моя проблема была решена, удалив @font-face из css.