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

1548

У меня есть 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 на веб-сервере.

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

  • 9
    Html2Pdf фактически использует встроенный экземпляр IE для визуализации страницы, а затем преобразует его в PDF - возможно, с помощью механизма печати IE.
  • 51
    так как это вопрос 2008 года, dompdf сейчас гораздо более зрелый. ;-)
Показать ещё 17 комментариев
Теги:
pdf
pdf-generation

34 ответа

488
Лучший ответ

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

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


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

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

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

Образцы PrinceXML

  • 0
    Ну, кажется, вы можете скачать только настольную версию. Я действительно хотел бы попробовать версию сервера. Но настольная версия проделала отличную работу (равную моей окончательной версии html2pdf, но практически мгновенно). Спасибо за рекомендацию.
  • 1
    Я уже использовал это для большого проекта. Очень хороший инструмент и поддержка существует. Просто пойти на это !
Показать ещё 17 комментариев
610

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

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

EDIT (2017):

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

  • 10
    Этот работает на лучшую предпосылку ИМО. Ускоренное преобразование из существующего рендерера вместо написания с нуля - не тривиальная задача. Кроме того, Webkit написан на C ++ и, следовательно, намного быстрее и требует гораздо меньше ресурсов, чем реализация на основе PHP.
  • 0
    Это замечательно. К худшему это требует, чтобы клиентские библиотеки X11 были установлены на сервере.
Показать ещё 13 комментариев
137

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

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

  • 1
    @cletus Можете ли вы рассказать мне о стабильной версии HTML2PDF. Приведенный выше пример ссылки устарел
  • 0
    Для получения последней версии см. Github.com/spipu/html2pdf.
Показать ещё 2 комментария
123

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

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

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

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

  • 0
    Это правда, mpdf действительно работает, и это быстро, он создает файл PDF на лету.
  • 1
    Я попробовал кучу предложенных здесь. До сих пор этот был загружен и работал из коробки без каких-либо хлопот, и документы действительно удивительны по сравнению с остальными. Инструкция по применению четко написана.
Показать ещё 6 комментариев
61

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

  • 0
    Я бы попробовал GrabzIt, их API поддерживает CSS, JavaScript и большинство других типов ресурсов. На него просто нужно ссылаться с помощью абсолютных URL-адресов или сделать встроенным и включить его в HTML-код, который отправляется службе. Попробуйте это здесь: grabz.it/html-to-pdf-image-api.aspx
  • 0
    GrabzЭто не бесплатно
55

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

  • 1
    его поддержка для рендеринга html довольно ограничена, вы можете прочитать это: tcpdf.org/doc/classTCPDF.html#ac3fdf25fcd36f1dce04f92187c621407
  • 1
    но стиль CSS не работает
28

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

  • 0
    К сожалению, невозможно использовать, если вы хотите создавать большие PDF-файлы с большим количеством изображений. Я думаю, что есть 60-секундный предел времени для запросов, и если Docraptor необходимо загрузить много файлов, это будет превышено, и файл не будет создан.
  • 1
    Эта проблема, упомянутая Вильгельмом, была исправлена.
26

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

25

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

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

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

  • 1
    Я создал HTTP API, который использует Snappy (на основе wkhtmltopdf). Вы можете передать URL и преобразовать веб-страницу из HTML в PDF: github.com/Dellos7/dhtml2pdf
24

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

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

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

  • 3
    PDF плейлиста. Боже, помоги мне.
23

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

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

См. ниже:

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

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

20

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

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

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

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

  • 1
    Почему это не сверху? Он работает без каких-либо дополнительных зависимостей и достаточно хорош для приложений большинства людей, не тратя $ 3800!
19

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

18

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

14

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

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

  • 0
    dompdf действительно отличный вариант. Я использовал два раза, и это очень легко. Я рекомендую попробовать dompdf. Вот ссылка для официального репозитория github: github.com/dompdf/dompdf
13

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

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

  • 0
    Спасибо за обмен. Я целый день изучал все варианты и больше концентрировался на свободных библиотеках или покупке библиотеки. Ваш ответ снова поможет мне. Я думаю, что для малого бизнеса это экономичный и самый простой способ использования веб-сервисов. Для pdflayer.com; менее чем за 100 долларов в год на безубыточность уходит 20 или 30 лет, но я не думаю, что мы оставим в том же мире 20 лет спустя :)
  • 0
    api2pdf.com дешевле, чем все эти. ~ 10000 PDF-файлов за 2 доллара
13

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

12

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

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

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

  • 0
    но у вас могут быть некоторые проблемы со шрифтами (веб-шрифтами)
11

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

CutyCapt

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

9

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

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

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

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

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

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

https://rotativahq.com

9

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

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

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

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

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

  • 0
    PHP полезен, если вы хотите вывести какую-то официальную документацию, такую как квитанция для пользователя, и вы можете использовать CSS, чтобы она выглядела красиво.
9

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

  • 0
    Да, верный момент, но я уже думал об этом. В моем HTML нет ни единого, ни нестандартного тега.
7

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

7

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

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

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

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

  • 0
    Я не хотел бы полагаться на сервис, когда он выставлен на продажу . Учитывая тот факт, что он был продан на этом аукционе, я могу только предположить, что он будет продан в ближайшее время?
  • 0
    на самом деле моя компания приобрела его через некоторое время после аукциона ....
Показать ещё 1 комментарий
7

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

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

  • 0
    Да, это подтверждает.
6

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

5

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

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

5

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

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

  • 0
    для меня библиотека очень ограничена
4

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

4

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

  • 0
    Zend PDF не может конвертировать из HTML
3

если вы хотите конвертировать менее 100 html-страниц в pdf в течение месяца, чем pdfcrowd может выполнить эту работу за вас. На самом деле просто и легко интегрировать.

3

pdfcrowd выполняет работу с простым API. Бесплатно для личного использования и не так дорого для профессионального использования.

3

Веб-API

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

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

2

не PHP, но Java библиотека, которая делает следующее:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню