Web

Как можно добавить HTML и CSS в PDF

У меня есть документ HTML (не XHTML), который отлично отображается в Firefox и IE. Он использует довольно простой CSS для его стилизации и отлично отображает HTML.

Теперь мне нужен способ конвертировать его в PDF. Я пытался:

  • DOMPDF: у него были огромные проблемы с таблицами. Я выделил свои большие вложенные таблицы, и это помогло (раньше он просто потреблял до 128 МБ памяти, а затем падал это мой предел по памяти в php.ini). Он также создает беспорядок в таблицах и, похоже, не отображает изображения. Таблицы были просто базовыми элементами с некоторыми стилями границ для добавления линий в различных точках;

  • HTML2PDF и HTML2PS: мне с этим больше повезло. Он визуализировал некоторые изображения (все изображения являются URL-адресами Google Chart), и форматирование таблицы было намного лучше, но, похоже, возникла проблема, которую я еще не понял, и он продолжал падать с неизвестными ошибками node_type(). Не знаю, что делать дальше.

  • Htmldoc: похоже, это нормально работает с базовым HTML, но почти не поддерживает CSS, поэтому нужно делать все в HTML, поэтому для меня это бесполезно.

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

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

 

Ответ 1

После некоторого расследования было найдено решение, которое основано на HTML2PDFDOMPDF неудачно справился с таблицами, границами и даже умеренно сложным макетом, а htmldoc кажется достаточно надежным, но почти полностью игнорирует CSS, и я не хочу возвращаться к созданию макета HTML без CSS только для этой программы.

HTML2PDF выглядел наиболее многообещающим, но у меня продолжалась странная ошибка, связанная с нулевыми ссылочными аргументами для node_type. Я наконец нашел решение этого. По сути, PHP 5.1.x отлично работал с заменами регулярных выражений (preg_replace_ *) на строки любого размера. PHP 5.2.1 представил конфигурационную директиву php.ini под названием pcre.backtrack_limit. Этот параметр конфигурации ограничивает длину строки, для которой выполняется сопоставление. Почему это было введено я не знаю. Значение по умолчанию было выбрано 100000. Почему такое низкое значение? Неизвестно.

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

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

  • pcre.backtrack_limit = 2000000; # возможно больше, чем мне нужно

  • memory_limit = 1024M; # один гигабайт 

  • max_execution_time = 600; #  10 минут

Проницательный читатель, возможно, заметил, что размер моего HTML-файла меньше 100 КБ. Единственная причина, по которой, как я думаю, я столкнулся с этой проблемой, заключается в том, что html2pdf выполняет преобразование в xhtml как часть процесса. Как бы то ни было, вышеуказанное сработало.

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

К сожалению, это лучшее решение, которое мне известно.

 

Ответ 2

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

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

Но имейте в виду, что документация достаточно сложна для понимания.

С помощью этой библиотеки можно выполнять очень простые задачи, связанные с преобразованием HTML в PDF, но для более сложных задач потребуется некоторое время, чтобы прочитать и «понять» документацию.

 

Ответ 3

 

1. Используйте MPDF

Код для реализации:

<?php

include('../mpdf.php');

$mpdf=new mPDF();

$mpdf->WriteHTML('<p style="color:red;">Привет мир<br/>Некоторый текст</p>');

$mpdf->Output();   

exit;

?>



2. Используйте pdfToHtml

1) распакуйте pdftohtml.exe в корневую папку;

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

?>

3) войдите в FinalFolder, и там будут преобразованные файлы (столько же страниц, сколько было в исходном PDF).

 

Схожие статьи

Web

Извлечение данных из JSON с помощью PHP

Web

Как поместить информацию в контроллер Laravel 8

Web

Использование цикла для SimpleXML с помощью foreach в php

Web

Как узнать, установлен ли флажок в PHP