Преобразование 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 …), поэтому для меня это бесполезно.

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

Я действительно не могу поверить, что я застрял. Я что-то упускаю?

Важно: обратите внимание, что этот ответ был написан в 2009 году, и сегодня это может быть не самое экономичное решение в 2017 году. Браузеры и другие рендеринги с открытым исходным кодом стали намного лучше, чем тогда.


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

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

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

Образцы PrinceXML

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

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

EDIT (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 . Этот параметр конфигурации ограничивает длину строки, для которой выполняется сопоставление. Почему это было введено, я не знаю. Значение по умолчанию было выбрано как 100 000. Почему такая низкая стоимость? Опять же, не знаю.

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

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

Таким образом, у меня есть 70-килобайтный HTML-файл, чтобы превратиться в PDF. Для этого требуются следующие настройки php.ini:

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

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

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

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

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

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

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

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

1) используйте MPDF !

a) извлечение в yourfolder

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

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

c) открыть файл.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, которые могут быть достаточно для того, что вам нужно. Это также бесплатно!

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

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

Хорошие новости! Snappy !!

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

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

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

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

Смотри ниже:

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

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

Я использую fpdf для создания pdf-файлов с использованием php. До сих пор он работает хорошо для того, чтобы производить простые результаты.

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

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

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

Загрузите страницу .

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

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

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

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

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

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

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

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

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

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

Стоимость:

pdflayer.com – Как указано выше, наиболее рентабельным вариантом является pdflayer.com, предлагающий полностью бесплатный план подписки на 100 ежемесячных PDF-файлов и премиальных подписчиков в диапазоне от 9,99 до 11,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 долларов США.

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

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

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

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

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

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

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

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

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

CutyCapt

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

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

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

В настоящее время услуга имеет конечные точки в четырех регионах: Австралии, США, США, Юго-Восточной Азии.

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

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

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

https://rotativahq.com

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

Что произойдет, когда выйдет новое правило css? (скоро css 3.0 …)

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

Во всяком случае, все еще есть много проблем с runninr firefox, как конвертер PDF …

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

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

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

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

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

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

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

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

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

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

Я пробовал много разных библиотек для 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, совместимые с CSS 2.1, для рендеринга в PDF

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