Конвертировать HTML + CSS в PDF с PHP?

У меня есть документ HTML (не XHTML), который прекрасно отображается в Firefox 3 и IE 7. Он использует довольно простой CSS для стилизации и отлично отображает в HTML.

Я сейчас после способа преобразования его в PDF. Я пытался:

  • DOMPDF: у него были огромные проблемы с таблицами. Я разложил свои большие вложенные таблицы, и это помогло (до того, как он потреблял до 128 МБ памяти, а затем умирал - это мой предел памяти в php.ini), но он создает полный беспорядок таблиц и, похоже, не получает изображений. Таблицы были просто основными вещами с некоторыми стилями границ, чтобы добавить несколько строк в разных точках;
  • HTML2PDF и HTML2PS: мне больше повезло с этим. Он рендерил некоторые изображения (все изображения являются URL-адресами Google Chart), и форматирование таблицы было намного лучше, но, похоже, возникла некоторая сложность, которую я еще не выяснил, и продолжал умирать с неизвестными ошибками node_type(). Не уверен, куда идти отсюда; а также
  • Htmldoc: кажется, что это нормально работает с базовым HTML, но почти не поддерживает CSS, поэтому вы должны делать все в HTML (я не знал, что это был 2001 год в Htmldoc-land...), так что это бесполезно для меня.

Я попробовал приложение для Windows под названием Html2Pdf Pilot, которое на самом деле сделало довольно приличную работу, но мне нужно что-то, что как минимум работает на Linux и идеально работает по требованию через PHP на веб-сервере.

Что мне не хватает, или как я могу решить эту проблему?

30 ответов

Решение

Важно: обратите внимание, что этот ответ был написан в 2009 году, и, возможно, он не самый экономически эффективный вариант сегодня, в 2019 году. Онлайн-альтернативы сегодня лучше, чем были тогда.

Вот некоторые онлайн-сервисы, которые вы можете использовать:


Посмотрите на PrinceXML.

Это, безусловно, лучший конвертер HTML/CSS в PDF, хотя он и не бесплатный (но, эй, ваше программирование может быть и бесплатным, поэтому, если это сэкономит вам 10 часов работы, вы свободны дома (так как вам также нужно принять во внимание, что альтернативные решения потребуют от вас установки выделенного сервера с подходящим программным обеспечением)

О, да, я упоминал, что это первое (и, вероятно, единственное) решение HTML2PDF, которое поддерживает полный ACID2?

Образцы PrinceXML

Посмотри на wkhtmltopdf, Это открытый исходный код, основанный на webkit и бесплатный.

Мы написали небольшой учебник здесь.

РЕДАКТИРОВАТЬ ( 2017):

Если бы сегодня было что-то построить, я бы больше не пошел этим путем.
Но вместо этого использовал бы http://pdfkit.org/.
Вероятно, удалив его из всех зависимостей nodejs для запуска в браузере.

После некоторого исследования и общего напряжения решение выглядит как HTML2PDF. DOMPDF проделал ужасную работу с таблицами, границами и даже умеренно сложным макетом, и htmldoc кажется достаточно надежным, но почти полностью игнорирует CSS, и я не хочу возвращаться к созданию HTML-макета без CSS только для этой программы.

HTML2PDF выглядел самым многообещающим, но у меня продолжала появляться странная ошибка, связанная с нулевыми ссылочными аргументами для node_type. Я наконец нашел решение этого. По сути, PHP 5.1.x отлично работал с заменами регулярных выражений (preg_replace_*) для строк любого размера. PHP 5.2.1 представил конфигурационную директиву php.ini, которая называется pcre.backtrack_limit. Этот параметр конфигурации ограничивает длину строки, для которой выполняется сопоставление. Почему это было введено, я не знаю. Значение по умолчанию было выбрано как 100000. Почему такая низкая стоимость? Опять не знаю.

Для этого была поднята ошибка в PHP 5.2.1, которая все еще открыта почти два года спустя.

Что ужасает в этом, так это то, что при превышении лимита замена просто молча завершается неудачей. По крайней мере, если ошибка возникла и была зарегистрирована, у вас будет некоторое представление о том, что произошло, почему и что нужно изменить, чтобы исправить это. Но нет.

Итак, у меня есть HTML-файл 70 КБ, который можно превратить в PDF. Требуются следующие настройки php.ini:

  • pcre.backtrack_limit = 2000000; # вероятно больше, чем мне нужно, но это нормально
  • memory_limit = 1024M; # да, один гигабайт; а также
  • max_execution_time = 600; # да, 10 минут.

Теперь проницательный читатель, возможно, заметил, что мой HTML-файл меньше, чем 100КБ. Единственная причина, по которой я могу догадаться, почему я столкнулся с этой проблемой, заключается в том, что html2pdf выполняет преобразование в xhtml как часть процесса. Возможно, это захватило меня (хотя почти 50% раздувания кажется странным). В любом случае, вышесказанное сработало.

Теперь html2pdf - это источник ресурсов. Мой файл 70 КБ занимает приблизительно 5 минут и не менее 500-600 МБ ОЗУ для создания 35-страничного файла PDF. К сожалению, недостаточно быстро (пока) для загрузки в режиме реального времени, и использование памяти устанавливает соотношение использования памяти порядка 1000 к 1 (600 МБ ОЗУ для файла 70 КБ), что совершенно нелепо.

К сожалению, это лучшее, что я придумал.

Почему бы вам не попробовать mPDF версии 2.0? Я использовал его для создания PDF документа. Работает нормально.

Между тем, mPDF имеет версию 5.7 и активно поддерживается, в отличие от HTML2PS/HTML2PDF.

Но имейте в виду, что с документацией действительно сложно работать. Например, взгляните на эту страницу: https://mpdf.github.io/.

С помощью этой библиотеки можно выполнить очень простые задачи, связанные с html в pdf, но более сложные задачи потребуют некоторого времени для чтения и "понимания" документации.

1) использовать MPDF!

а) извлекать в yourfolder

б) создать файл.php в yourfolder и вставьте такой код:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

в) открыть файл.php из вашего браузера




2) Используйте pdfToHtml!

1) Извлеките pdftohtml.exe в корневую папку:

2) внутри этой папки, в файле anyfile.php, поместите этот код (при условии, что есть также source example.pdf):

<?php
$source="example.pdf";
$output_fold="FinalFolder";

    if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
$result= passthru("pdftohtml $source $output_fold/new_filename",$log);
//var_dump($result); var_dump($log);
?>

3) введите FinalFolder, и будут преобразованные файлы (столько страниц, сколько было в исходном PDF-файле..)

Оформить заказ TCPDF. Он имеет некоторые функции HTML в PDF, которых может быть достаточно для того, что вам нужно. Это также бесплатно!

Я просто попробовал DOMPDF, и он отлично работал. Я использовал DIV и другие элементы уровня блока, чтобы расположить все, я держал это строго CSS 2.1, и это играло очень хорошо.

Я предлагаю DocRaptor (который использует PrinceXML как "двигатель")

Хорошие новости! Снаппи!!

Snappy - это очень простая библиотека PHP5 с открытым исходным кодом, позволяющая создавать эскизы, снимки или PDF с URL-адреса или HTML-страницы. И... он использует отличный wktmltopdf на основе webkit

Наслаждайтесь! ^_^

Это уже упоминалось, но я просто хочу подтвердить, что mpdf - самый простой, самый мощный и самый бесплатный конвертер html в pdf. Небо действительно предел. Вы даже можете создавать PDF-файлы динамических пользовательских данных.

Например, клиент хотел систему CMS, чтобы он мог обновить список треков музыки, которую он играл в своем клубе. Это не было проблемой, но он также хотел, чтобы пользователи могли загружать.pdf плейлиста, и поэтому этот загружаемый pdf также должен был обновляться cms. Благодаря mpdf, с некоторыми простыми циклами и переменными переменными, я смог сделать именно это. То, что я думал, заняло бы у меня недели, буквально заняло у меня минуты.

Отличная статья, которая помогла мне начать.

Хорошо, если вы хотите найти идеальную библиотеку конвертеров XHTML+CSS в PDF, забудьте об этом. Это далеко не возможно. Потому что это все равно что найти идеальный браузер (XHTML+ движок рендеринга CSS). У нас есть один? IE или FF?

У меня был некоторый успех с DOMPDF. Дело в том, что вы должны изменить свой HTML + CSS-код, чтобы он соответствовал принципам работы библиотеки. Помимо этого, у меня довольно хорошие результаты.

Увидеть ниже:

Оригинальный HTML

Преобразование HTML в PDF

HTML2PDF и HTML2PS, которые были первоначально упомянуты в первом посте, говорили о пакете 2009 года с этой ссылкой

Но есть лучший HTML2PDF

Он основан на TCPDF, хотя частично на французском.

Вы можете иметь верхние или нижние колонтитулы таблицы, которые повторяются на страницах и имеют номера страниц и общее количество страниц. Смотрите его примеры. Я использую его более трех лет и рекомендую его.

Я использую fpdf для создания PDF-файлов с использованием PHP. Пока что у меня хорошо получается производить простые выводы.

В Zezone есть учебник по генерации pdf из php ( часть 1, часть 2) без каких-либо внешних библиотек. Я никогда не реализовывал такого рода решения, но, поскольку это все php, вы можете найти его более гибким для реализации и отладки.

Упоминание Дэррила Хейна о TCPDF, вероятно, отличная идея. Код Никола Асуни довольно удобный и мощный. Единственное, что убивает, это то, что если вы когда-нибудь планируете объединять PDF-файлы с созданным PDF-файлом, он не имеет этих функций. Вам нужно будет создать PDF, а затем объединить его, используя что-то вроде PDFTK от Sid Steward (www.pdflabs.com/tools/pdftk-the-pdf-toolkit/).

Попробуйте захватить последнюю ночную сборку dompdf - я использовал более старую версию, которая была ужасным ресурсом и занимала рендеринг моего pdf. После ночного захвата отсюда.

Генерация PDF заняла всего несколько секунд - и он был так же хорошо отрисован, как и с PrinceXML / Docraptor. Похоже, они серьезно оптимизировали код dompdf со времени моего последнего использования!

С точки зрения стоимости, использование веб-службы (API) во многих случаях может быть более разумным подходом. Кроме того, отдавая на аутсорсинг этот процесс, вы освобождаете свою собственную инфраструктуру / бэкэнд и - при условии, что вы используете авторитетную службу - гарантируете совместимость с настройкой веб-стандартов, времени безотказной работы, коротких сроков обработки и быстрой доставки контента.

Я провел некоторые исследования по большинству веб-сервисов, имеющихся в настоящее время на рынке. Ниже приведены API-интерфейсы, которые, по моему мнению, стоит упомянуть в этой теме, в порядке, основанном на соотношении цены и стоимости. Все они предлагают предварительно составленные PHP-классы и пакеты.

  1. https://pdflayer.com/ - Стоимость: $ - Качество: ☆☆☆☆
  2. http://docraptor.com/ - Стоимость: $$$ - Качество: ☆☆☆☆☆
  3. http://pdfcrowd.com/ - Стоимость: $$ - Качество: ☆☆☆

Качественный:

Имея качественный двигатель PrinceXML в качестве основы DocRaptor предлагает наилучшее качество PDF, возвращая отлично отшлифованные и хорошо преобразованные PDF-документы. Однако служба API pdflayer здесь довольно близка. Pdfcrowd не обязательно оценивает качество, но скорость обработки.

Стоимость:

pdflayer.com - Как указано выше, наиболее экономически эффективным вариантом здесь является pdflayer.com, предлагающий совершенно бесплатный план подписки на 100 ежемесячных PDF-файлов и премиальных подписок в диапазоне от 9,99 до 119,99 долларов. Стоимость 10 000 ежемесячных PDF-документов составляет 39,99 долларов.

docraptor.com - 7-дневный бесплатный пробный период. Премиум-планы подписки варьируются от 15 до 2250 долларов. Стоимость 10 000 ежемесячных PDF-документов составляет ~ 300 долларов США.

pdfcrowd.com - Предлагая 100 PDF один раз бесплатно. Премиум-планы подписки колеблются от $9-89. Стоимость 10 000 ежемесячных PDF-документов составляет ~ 49,00 долларов США.

Я использовал все три из них, и этот текст должен помочь любому решить, не платя за все из них. Этот текст не был написан для поддержки какого-либо одного продукта, и я не имею никакого отношения ни к одному из продуктов.

Если у вас есть доступ к командной строке, можно использовать PhantomJS для создания PDF из URL (удаленный или локальный).

Это работает очень хорошо, и это бесплатное решение.

Взгляните на этот пример сценария, созданный для этой конкретной задачи.

Этот вопрос уже довольно старый, но никто не упомянул CutyCapt, так что я буду:)

CutyCapt

CutyCapt - это небольшая кроссплатформенная утилита командной строки для захвата рендеринга WebKit веб-страницы в различные векторные и растровые форматы, включая SVG, PDF, PS, PNG, JPEG, TIFF, GIF и BMP.

Я рекомендую TCPDF или DOMPDF, в таком порядке.

Я разработал публичный API для создания PDF-файлов из веб-страниц. Он имеет хороший клиентский класс PHP, который делает его очень простым в использовании. Он использует wkhtmltopdf для рендеринга PDF в облаке.

Не нужно ничего особенного в HTML. Нет необходимости в абсолютных URL-адресах в ссылках images/css/js. Работает на localhost (dev машина) тоже.

В настоящее время служба имеет конечные точки в 4 регионах Azure: Восток США, Запад США, Север ЕС, Юго-Восточная Азия.

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

Это надежно, потому что все конечные точки сбалансированы по нагрузке.

Бесплатный аккаунт доступен для тестирования или низкого использования. Подробности на сайте:

https://rotativahq.com/

Я не думаю, что класс php будет лучшим для рендеринга страницы xHtml с помощью css.

Что происходит, когда выходит новое правило CSS? (скоро CSS 3.0...)

Лучший способ визуализации HTML-страницы - это, конечно, браузер. Firefox 3.0 может изначально "печатать" в формате pdf, torisugary разработал расширение (печать из командной строки) для его использования. Здесь вы найдете это.

Во всяком случае, есть еще много проблем, связанных с Firefox, так же, как PDF-конвертер...

На данный момент, я думаю, что wkhtmltopdf - лучший (тот, который используется браузером Safari), быстрый, быстрый, потрясающий. Да, и с открытым исходным кодом... Дайте ему посмотреть

Возможно, вы можете попробовать использовать Tidy перед передачей файла в конвертер. Если один из рендереров захлебнется какой-то проблемой HTML (например, незакрытым тегом), это может помочь.

Хотя уже есть много решений, я рекомендую следующие два:

  1. HTM2PDF - предлагает API для преобразования HTML в PDF, а также имеет PHP SDK, что делает его очень простым для реализации в PHP; Он предлагает выбор серверных мест в Европе, Азии и США.
  2. PDFmyURL - предлагает API, который также обрабатывает URL и HTML в PDF, примерно с той же функциональностью, что и HTM2PDF, но работает в среде с балансировкой нагрузки и работает чуть дольше

Отличие этих двух API от всех ранее упомянутых решений заключается в том, что, помимо преобразования HTML в PDF с помощью CSS и JavaScript, он также предлагает управление правами на PDF, водяные знаки и шифрование. Поэтому это решение "все в одном" для тех, кто хочет взяться за дело.

Отказ от ответственности: я работаю в Kaiomi, компании, которая управляет обоими этими сайтами.

Прекрасный рендеринг ничего не значит. Это подтверждает?

Все браузеры делают все возможное, чтобы просто показать что-то на экране, независимо от того, насколько плохой ввод. И, конечно, они не делают то же самое. Если вам нужен тот же рендеринг, что и в FireFox, вы можете использовать его движок рендеринга. Для этого есть генераторы PDF. Хотя это ужасно много работы.

TCPDF работает нормально, без зависимостей, бесплатен и постоянно исправляется. Он имеет разумную скорость, если предоставленное содержимое HTML/CSS хорошо отформатировано. Обычно я генерирую от 50 до 300 кБ входных данных HTML (включая CSS) и получаю вывод PDF в течение 1-3 секунд с 10 - 15 страницами PDF.

Я настоятельно рекомендую использовать библиотеку tidy в качестве средства форматирования HTML перед отправкой чего-либо в TCPDF.

Я пробовал много разных библиотек для PHP. Все перечисленное я пробовал. На мой взгляд, библиотека TCPDF - лучшая компромиссная производительность / удобство использования. Это очень просто для установки и использования, а также хорошая производительность в небольших средних приложениях. Если вам нужна высокая производительность и очень большой PDF-документ, используйте модуль Zend_PDF, но будьте готовы к кодированию!

Действительно ли преобразование HTML в PDF должно происходить на стороне сервера с использованием PHP?

Я только что натолкнулся на jsPDF, решение на стороне клиента, использующее HTML5/JavaScript. MIT-лицензированный код есть и на GitHub.

Веб-API

Если есть люди, которые всегда ищут подобные вещи, есть бесплатный сайт, который позволяет вам конвертировать HTML-код и страницы в PDF. Существует также (очень маленький) API, который позволяет вам получить PDF-файл из URL.

Проверьте это здесь

Не PHP, а библиотекаJava, которая делает это:

Flying Saucer принимает XML или XHTML и применяет к нему таблицы стилей, совместимые с CSS 2.1, для рендеринга в PDF

Это можно использовать из PHP через system() или аналогичный звонок. Хотя для этого требуется правильная форма XML input,

Другие вопросы по тегам