Преобразование 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 на веб-сервере.

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

1422
задан cletus 24 дек. '08 в 11:14
источник поделиться
34 ответов
  • 1
  • 2

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


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

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

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

Примеры PrinceXML

456
ответ дан SchizoDuckie 12 янв. '09 в 11:47
источник поделиться

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

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

EDIT (2017):

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

633
ответ дан Mic 31 авг. '09 в 16:36
источник поделиться

После некоторого исследования и общего вытягивания волос решение кажется 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 тыс.), Что совершенно нелепо.

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

143
ответ дан cletus 12 янв. '09 в 6:51
источник поделиться

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

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

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

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

118
ответ дан Karthick 26 марта '10 в 14:11
источник поделиться

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 файле..)

63
ответ дан T.Todua 28 нояб. '13 в 17:52
источник поделиться

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

53
ответ дан Darryl Hein 21 февр. '09 в 23:50
источник поделиться

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

29
ответ дан Oren 13 нояб. '10 в 3:48
источник поделиться

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

27
ответ дан Filip Dupanović 22 янв. '09 в 2:32
источник поделиться

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

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

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

24
ответ дан Paulo Coghi 21 нояб. '11 в 23:23
источник поделиться

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

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

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

22
ответ дан Starkers 18 февр. '13 в 23:50
источник поделиться

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

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

См. ниже:

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

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

22
ответ дан datasn.io 27 дек. '08 в 9:17
источник поделиться
HTML2PDF и HTML2PS, который изначально упоминался в открытии сообщения, рассказывал о пакете 2009 с этой ссылкой

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

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

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

20
ответ дан Luke Wenke 07 мая '15 в 13:43
источник поделиться

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

18
ответ дан 21 февр. '09 в 23:21
источник поделиться

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

18
ответ дан yoavf 24 дек. '08 в 12:46
источник поделиться

С точки зрения стоимости использование веб-сервиса (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 долларов США.

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

13
ответ дан Frank 11 февр. '16 в 20:51
источник поделиться

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

13
ответ дан Arachnid 24 авг. '10 в 22:01
источник поделиться

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

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

12
ответ дан Arni J 10 авг. '11 в 16:16
источник поделиться

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

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

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

12
ответ дан chjortlund 08 окт. '14 в 17:14
источник поделиться

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

CutyCapt

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

11
ответ дан Koen. 20 февр. '12 в 18:19
источник поделиться

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

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

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

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

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

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

https://rotativahq.com

9
ответ дан Giorgio Bozio 22 июня '16 в 17:22
источник поделиться

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

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

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

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

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

9
ответ дан Strae 13 мая '09 в 0:02
источник поделиться

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

9
ответ дан PhiLho 24 дек. '08 в 12:16
источник поделиться

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

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

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

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

7
ответ дан user1914292 02 июня '14 в 20:59
источник поделиться

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

7
ответ дан Rajnikant Kakadiya 03 дек. '17 в 4:19
поделиться

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

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

6
ответ дан Stephan Eggermont 24 дек. '08 в 12:09
источник поделиться

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

5
ответ дан criss_ae 17 мая '13 в 15:38
источник поделиться

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

5
ответ дан trullallero 22 мая '13 в 9:47
источник поделиться

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

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

5
ответ дан lubosdz 08 дек. '13 в 14:09
источник поделиться

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

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

5
ответ дан Oliver Schafeld 29 авг. '13 в 18:06
источник поделиться

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

4
ответ дан Simanas 03 дек. '17 в 4:19
поделиться
  • 1
  • 2

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