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

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

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

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

    [deploy@localhost ~]$ 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
    

    а также

    [deploy@localhost ~]$ 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
    
  3. wkhtmltopdf частично работает с HTTP. В выходных pdf-файлах отсутствует некоторый контент/фон/позиции.

    [deploy@localhost ~]$ 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
    
    [deploy@localhost ~]$ 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
    

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


person Murali Mopuru    schedule 17.09.2014    source источник
comment
Это действительно похоже на ошибки, на которые лучше всего ответил бы ashkulz в трекере проблем github, я думаю, вам больше всего повезет просить там.   -  person Joel Peltonen    schedule 22.09.2014
comment
comment
Я получил аналогичную ошибку и удалил @font-face из css, и проблема исчезла.   -  person pravin kumar sinha    schedule 05.05.2018


Ответы (4)


К сожалению, 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 с дополнительным скриптом, например, используя rasterize.js:

phantomjs rasterize.js http://example.com/

или dompdf (конвертер HTML в PDF для PHP, который можно установить с помощью 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");
person kenorb    schedule 20.05.2015
comment
Все прошло так же, как вы упомянули здесь, я тоже узнал относительные пути к ресурсам, неработающие ссылки и т. Д. После небольшой работы над wkhtmltopdf. Я исправил свою проблему со скриптами phantomjs. - person Murali Mopuru; 23.05.2015

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

person Esther    schedule 18.11.2017

У меня была эта проблема раньше. и решите это, как показано ниже.

wkhtmltopdf

В приведенном выше примере у меня было несколько файлов «src» и «url», которые ссылаются на статический каталог, но статический каталог не существовал, поэтому wkhtmltopdf выдал мне эту ошибку. Например:

src: url("file:///home/ehsan/Projects/Example/main/sib/static/WebYekan.eot");

и еще одна важная вещь, которую я должен сказать, это то, что все пути к файлам в html-файлах должны быть абсолютными. вообще не используйте относительный путь.

Я надеюсь, что это поможет вам.

person Ehsan Ahmadi    schedule 20.05.2020

Я много искал, но не мог найти, но, наконец, нашел здесь. Я использовал (./name), но это создало ошибку contentnotfound.

Но в итоге использовал полный адрес и получил желаемый результат

person Gaurav Pandey    schedule 28.05.2020
comment
Извините, я не совсем понимаю, что вы предлагаете в качестве ответа. Может быть, пример кода вашего решения? - person shox; 28.05.2020