Конвертировать 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?
Посмотри на 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-код, чтобы он соответствовал принципам работы библиотеки. Помимо этого, у меня довольно хорошие результаты.
Увидеть ниже:
HTML2PDF и HTML2PS, которые были первоначально упомянуты в первом посте, говорили о пакете 2009 года с этой ссылкой
Но есть лучший HTML2PDF
Он основан на TCPDF, хотя частично на французском.
Вы можете иметь верхние или нижние колонтитулы таблицы, которые повторяются на страницах и имеют номера страниц и общее количество страниц. Смотрите его примеры. Я использую его более трех лет и рекомендую его.
Я использую fpdf для создания PDF-файлов с использованием 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-классы и пакеты.
- https://pdflayer.com/ - Стоимость: $ - Качество: ☆☆☆☆
- http://docraptor.com/ - Стоимость: $$$ - Качество: ☆☆☆☆☆
- 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.
Я разработал публичный API для создания PDF-файлов из веб-страниц. Он имеет хороший клиентский класс PHP, который делает его очень простым в использовании. Он использует wkhtmltopdf для рендеринга PDF в облаке.
Не нужно ничего особенного в HTML. Нет необходимости в абсолютных URL-адресах в ссылках images/css/js. Работает на localhost (dev машина) тоже.
В настоящее время служба имеет конечные точки в 4 регионах Azure: Восток США, Запад США, Север ЕС, Юго-Восточная Азия.
Это быстро, так как он использует собственный протокол для отправки содержимого веб-страницы в API для преобразования в PDF.
Это надежно, потому что все конечные точки сбалансированы по нагрузке.
Бесплатный аккаунт доступен для тестирования или низкого использования. Подробности на сайте:
Я не думаю, что класс php будет лучшим для рендеринга страницы xHtml с помощью css.
Что происходит, когда выходит новое правило CSS? (скоро CSS 3.0...)
Лучший способ визуализации HTML-страницы - это, конечно, браузер. Firefox 3.0 может изначально "печатать" в формате pdf, torisugary разработал расширение (печать из командной строки) для его использования. Здесь вы найдете это.
Во всяком случае, есть еще много проблем, связанных с Firefox, так же, как PDF-конвертер...
На данный момент, я думаю, что wkhtmltopdf - лучший (тот, который используется браузером Safari), быстрый, быстрый, потрясающий. Да, и с открытым исходным кодом... Дайте ему посмотреть
Возможно, вы можете попробовать использовать Tidy перед передачей файла в конвертер. Если один из рендереров захлебнется какой-то проблемой HTML (например, незакрытым тегом), это может помочь.
Хотя уже есть много решений, я рекомендую следующие два:
- HTM2PDF - предлагает API для преобразования HTML в PDF, а также имеет PHP SDK, что делает его очень простым для реализации в PHP; Он предлагает выбор серверных мест в Европе, Азии и США.
- 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
,