Преобразование 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 (I не понимал, что все еще было в 2001 году в Хтмдолце-земле...), так что это бесполезно для меня.

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

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

Ответ 1

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

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


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

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

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

Образцы PrinceXML

Ответ 2

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

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

EDIT (2017):

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

Ответ 3

После некоторого исследования и общего вытягивания волос решение кажется 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. Почему такая низкая стоимость? Опять же, не знаю.

A ошибка против 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 тыс.), Что совершенно нелепо.

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

Ответ 4

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

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

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

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

Ответ 5

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 поместите этот код (предположим, есть и исходный пример .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 файле..)

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

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

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

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

Ответ 11

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

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

См. ниже:

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

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

Ответ 12

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

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

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

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

  • pdflayer.com - Стоимость: $- Качество: ☆☆☆☆
  • docraptor.com - Стоимость: $$$ - Качество: ☆☆☆☆☆
  • pdfcrowd.com - Стоимость: $$ - Качество: ☆☆☆

Качество:

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

Стоимость:

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

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

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

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

Ответ 18

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

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

Посмотрите на этот example script, сделанный для этой точной проблемы.

Ответ 19

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

CutyCapt

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

Ответ 20

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

Ответ 21

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

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

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

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

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

Ответ 22

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

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

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

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

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

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

https://rotativahq.com

Ответ 23

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

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

Ответ 24

Используйте DOMPDF для получения наилучшего результата. Вот Примеры ссылок.

Ответ 25

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

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

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

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

Ответ 26

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

Ответ 27

Требуется ли преобразование HTML в PDF на сервере с помощью PHP?

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

Ответ 28

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

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

Ответ 29

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

Ответ 30

Здесь мой подход, используя phantomjs.