Как я могу автоматизировать преобразования HTML в PDF? - PullRequest
43 голосов
/ 07 октября 2008

Я уже некоторое время пользуюсь htmldoc, но столкнулся с некоторыми довольно серьезными ограничениями. Мне нужно конечное решение для работы на Linux. Я буду вызывать эту библиотеку / утилиту / приложение из приложения Perl, поэтому любые интерфейсы Perl будут бонусом.

Ответы [ 12 ]

62 голосов
/ 07 мая 2010

Извините, что раскопал этот старый пост, но он был первым в моем поиске лучшего инструмента для конвертации HTML / PDF. В Linux wkhtmltopdf очень хорош (с учетом CSS и других) и GPL.

17 голосов
/ 28 апреля 2016

WeasyPrint создает прекрасные PDF-файлы с выбираемым текстом и гиперссылками.

weasyprint input.html output.pdf

Если вы используете wkhtmltopdf, попробуйте следующие опции:

wkhtmltopdf --margin-bottom 20mm --margin-top 20mm --minimum-font-size 16 ...
9 голосов
/ 14 августа 2017

Обновление 2019-05

К счастью, весь процесс упакован в образ докера TheCodingMachine: https://github.com/thecodingmachine/gotenberg

Это делает обслуживание и использование генерации PDF на основе хрома в производственных средах действительно плавным и беспроблемным.


С Chrome 59 появился новый режим безголового управления. Поскольку все другие решения действительно борются с более новыми (или уже не такими новыми) функциями CSS, такими как flexbox, в моем случае это было единственное решение для получения правильного вывода PDF.

Чтобы создать pdf из локального html-файла, используйте следующую команду: chrome --headless --disable-gpu --print-to-pdf file:///path/to/myfile.html.

Для Mac OS chrome с /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.

Единственный недостаток, который я заметил до сих пор, это то, что (в настоящее время) вы не можете передать html через stdin, но создание временного файла не так уж и большая проблема.

Для получения дополнительной информации см. https://developers.google.com/web/updates/2017/04/headless-chrome#create_a_pdf_dom

Обновление: как выясняется, ребята из Chrome, скорее всего, предоставят какой-то узел модуля узла для этой задачи, что в конечном итоге приведет к устареванию режима без головы (https://bugs.chromium.org/p/chromium/issues/detail?id=719921).

Лучше всего было бы использовать подход на основе узлов с использованием кукловода модуль, как описано в https://developers.google.com/web/updates/2017/04/headless-chrome#node, и распечатайте страницу с помощью команды Page.printToPDF, которая также позволяет выполнить некоторые дополнительные настройки.

Конечно, вы можете подключиться к веб-сокету отладочной консоли из любой другой среды, кроме узла (например, PHP-скрипт).

8 голосов
/ 07 октября 2008

PrinceXML - лучший, который я видел (он анализирует обычный HTML, а также XML / XHTML). Как это лучше? Ну, он проходит тест acid2 , который, как мне показалось, был чертовски впечатляющим

Это, однако, довольно дорого

7 голосов
/ 07 октября 2008

Я немного погуглил и предложил два варианта. Может быть, моя стратегия Google заключалась в том, чтобы попробовать «webkit pdf из командной строки» и «gecko pdf из командной строки», в основном ища программы командной строки, в которые встроены два популярных движка рендеринга с открытым исходным кодом в средствах визуализации командной строки. Вот что я нашел:

Принтер командной строки Firefox - вывод в pdf и png

wkpdf - хотя это для Mac, он, вероятно, довольно портативный.

3 голосов
/ 07 октября 2008

Я не буду утверждать, что это «лучшее» решение, но это «решение», которое я использовал.

Ввод HTML -> HTML 2 PS -> PS 2 PDF -> Вывод PDF

1 голос
/ 09 апреля 2019

Альтернативное решение, на которое еще нет ответа, - это использовать API.

Это преимущество заключается в том, что вы выводите ресурсы, необходимые для работы, и получаете современную службу, которая реализует последние функции (нет необходимости обновлять код или устанавливать исправления).

Например, с PDFShift вы можете сделать это с помощью одного запроса POST по адресу:

POST https://api.pdfshift.io/v2/convert/

И, передав "source" (либо URL, либо необработанный HTML-код), вы получите PDF в двоичном виде. (Отказ от ответственности: я работаю в PDFShift).

Вот пример кода на Python:

import requests

response = requests.post(
    'https://api.pdfshift.io/v2/convert/',
    auth=('user_api_key', ''),
    json={"source": "https://en.wikipedia.org/wiki/PDF", "landscape": False, "use_print": False}
)

response.raise_for_status()

with open('wikipedia.pdf', 'wb') as f:
    f.write(response.content)

И ваш PDF будет находиться по адресу ./wikipedia.pdf

1 голос
/ 31 марта 2019

Вы можете установить бесплатный Caliber и использовать утилиту командной строки ebook-convert, которая у него есть, для преобразования многих HTML-документов в один epub или pdf.

https://manual.calibre -ebook.com / генерироваться / о / электронная книга-convert.html

Идея приходит отсюда

Я не использовал его, но этот модуль npm завершает этот процесс, как мой следующий скрипт bash, но, вероятно, лучше; -)

Для себя на своем Mac я использую следующий скрипт bash для преобразования локального html-сайта в PDF:

convert_html_to_pdf.sh

function show_help()
{
  ME=$(basename $0)
  IT=$(cat <<EOF

  Converts an html file to pdf, epub, mobi or more if you look!

  usage: input.html output.{pdf|epub|mobi}

  e.g. 

  $ME index.html output.pdf 

  Note: Requires Calibre be installed. more info here: https://ebooks.stackexchange.com/a/6285
EOF
  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ "$1" == "--help" ]
then
  show_help
fi

/Applications/calibre.app/Contents/MacOS/ebook-convert $1 $2 --max-levels=1
1 голос
/ 30 марта 2015

Вы должны взглянуть на http://phantomjs.org/

Преобразование может быть выполнено с помощью небольшого сценария rasterize.js , а затем введите

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
1 голос
/ 07 октября 2008

Это было бы полным перебором, но вы можете загрузить и установить mirth . Это механизм маршрутизации сообщений, но он имеет возможность конвертировать html в pdf, так что вы можете настроить его так, чтобы он брал html-файл в папке, конвертировал в pdf и помещал pdf в ту же или другую папку. Как я уже сказал, перегиб, немного кривой обучения, но это бесплатно, и Java, так что вы можете запустить его на Linux, если хотите. И все, что нужно сделать вашему Perl-приложению, это перенести HTML в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...