it-swarm.com.ru

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

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

1539
cletus

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

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


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

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

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

PrinceXML Samples

518
SchizoDuckie

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

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

РЕДАКТИРОВАТЬ (2017):

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

657
Mic

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

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

Итак, у меня есть 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 МБ RAM для создания 35-страничного файла PDF. К сожалению, недостаточно быстро (пока) для загрузки в режиме реального времени, и использование памяти устанавливает соотношение использования памяти порядка 1000 к 1 (600 М RAM для файла 70 КБ), что совершенно нелепо ,.

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

147
cletus

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

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

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

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

121
Karthick

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

а) выписка в yourfolder

б) создать 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;
 ?>

в) открыть file.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 было ..)

66
T.Todua

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

55
Darryl Hein

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

30
Oren

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

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

Отлично статья это помогло мне начать.

28
Starkers

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

28
Filip Dupanović

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

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

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

28
Paulo Coghi

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

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

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

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

24
Luke Wenke

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

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

Увидеть ниже:

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

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

24
datasn.io

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

20
yoavf

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

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

15
Arni J

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

15
Arachnid

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

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

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

Качество:

Обладая высококачественным механизмом PrinceXML в качестве основы, DocRaptor , несомненно, предлагает наилучшее качество PDF, возвращая полированные и хорошо преобразованные PDF документы. Однако служба pdflayer API здесь довольно близка. 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,00 долларов США.

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

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

13
Frank

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

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

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

12
chjortlund

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

CutyCapt

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

11
Koen.

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

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

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

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

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

9
Strae

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

9
PhiLho

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

Не нужно ничего особенного в HTML. Нет необходимости в абсолютных URL-адресах в изображениях/CSS/JS ссылки. Работает на localhost (dev машина) тоже.

В настоящее время служба имеет конечные точки в 4 регионах Azure: Восток США, Запад США, Север ЕС, Юго-Восточная Азия.

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

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

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

https://rotativahq.com

9
Giorgio Bozio

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

9
criss_ae

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

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

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

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

7
user1914292

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

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

7
Stephan Eggermont

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

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

5
lubosdz

Действительно ли необходимо преобразование HTML в PDF на стороне сервера с использованием PHP?

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

5
Oliver Schafeld

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

4
trullallero

Веб-API

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

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

3
Superdrac

не PHP, но Java библиотека , который делает вещь:

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

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

2
Ivan Kurmanov