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