HTML2PDF в PHP – конвертировать утилиты и скрипты – примеры и демонстрации

У меня довольно сложный макет HTML / CSS, который я бы хотел преобразовать в PDF на моем сервере. Я уже пробовал DOMPDF, к сожалению, он не конвертировал HTML с правильным макетом. Я рассмотрел HTMLDOC, но я слышал, что он игнорирует CSS в значительной степени, поэтому я предполагаю, что макет также разложится с этим инструментом.

Мой вопрос для этого – есть ли онлайн-демонстрации для других инструментов (например, wkhtmltopdf ie), которые я мог бы использовать для проверки того, как мой HTML-код преобразуется? Прежде чем тратить оставшуюся часть моей жизни на установку и тестирование по одному?

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

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

  1. wkthmltopdf – это действительно ТОЛЬКО решение, которое работало для меня, что могло бы дать то, что я называю приемлемыми результатами. Тем не менее, некоторые незначительные изменения в CSS должны были быть сделаны, однако, он работал очень хорошо, когда дело доходило до предоставления контента. Все остальные пакеты действительно подходят только в том случае, если у вас есть довольно простой документ с одной базовой таблицей и т. Д. Невозможно получить их для получения справедливых результатов в сложных документах с элементами дизайна, css, множественными перекрывающимися изображениями и т. Д. Если сложные документы находятся в игре – Не тратьте время (как я и сделал) – идите прямо к wkhtmltopdf .

  2. Остерегайтесь – установка wkhtmltopdf сложна . Мне было не так легко, как ребята говорили в своих комментариях (одна из причин может заключаться в том, что я не слишком хорошо знаком с Linux). Статический бинар не работал для меня по какой-то причине, я не могу объяснить. Я подозреваю, что были проблемы с версией – видимо, есть разница между версиями для разных ОС и процессоров, может быть, у меня есть версия vrong. Для установки нестатической версии в первую очередь вы должны иметь root-доступ к серверу, это очевидно. Я установил его с помощью apt-get с помощью PuTTy , прошел неплохо. Мне повезло, что на моем сервере уже были все предрасположенности для установки wkhtmltopdf. Так что это была легкая часть для меня 🙂 (кстати, вам не нужно заботиться о символических ссылках или обертках, о чем говорит много уроков – я часами пытался выяснить, как это сделать, в конце концов я дал это и все работает хорошо, хотя)

  3. После установки у меня получилось довольно известное сообщение Cannot connect to X server ошибке Cannot connect to X server . Это связано с тем, что нам нужно запустить wkhtmltopdf без головок на «виртуальном» сервере x . Обход этого тоже был довольно прост (если на него не нужны символические ссылки). Я установил его с помощью apt-get install xvfb . Для меня это тоже неплохо, никаких проблем.

  4. После этого я смог запустить wkhtmltopdf . Опасайтесь – мне потребовалось некоторое время, чтобы понять, что попытка запустить xvfb была неправильным способом – вместо этого вам нужно запустить xvfb-run . Мой PHP-код теперь выглядит как этот exec("xvfb-run wkhtmltopdf --margin-left 16 /data/web/domain.com/source.html /data/web/domain.com/target.pdf"); (обратите внимание на --margin-left 16 командной строки --margin-left 16 для wkhtmltopdf – это делает мой контент более сосредоточенным, я оставил его на месте, чтобы продемонстрировать, как вы можете использовать параметры командной строки).

  5. Я также хотел защитить созданные файлы PDF от редактирования (в моем случае также возможна защита печати). После некоторых исследований я нашел этот класс у ID Security Suite . Прежде всего, я должен сказать – это OLD (я запускаю PHP 5+). Однако я сделал некоторые улучшения. Прежде всего – это оболочка библиотеки FPDF , поэтому в пакете есть файл fpdf.php. Я заменил этот файл с последней версии FPDF, которую я получил отсюда . Это сделало мои предупреждения PHP более устойчивыми. Я также изменил $pdf =& new FPDI_Protection(); и удалил & знак, поскольку я получал устаревшее предупреждение для него. Однако впереди еще много. Вместо поиска и изменения кода я просто превратил сообщение об ошибке lvl в 0 с error_reporting(0); (хотя выключение предупреждений должно быть достаточно). Теперь кто-то скажет, что это не «хорошая практика». Я использую весь этот материал во внутренней системе, поэтому мне не все равно. Конечно, сценарии могут быть модифицированы в соответствии с последними требованиями. Для меня я не хотел тратить на это еще несколько часов. Будьте осторожны, когда скрипт говорит $pdf->SetProtection(array('print'), '', $password); (Я разрешил печатать документы, как вы можете видеть). Мне потребовалось некоторое время, чтобы понять, что первым аргументом являются разрешения . Второй – ПАРОЛЬ ПОЛЬЗОВАТЕЛЯ – если вы предоставите это, тогда документы потребуют открыть пароль (я оставил этот пробел). Третий – ПАРОЛЬ ВЛАДЕЛЬЦА – это то, что вам нужно, чтобы документы были «защищены» от редактирования, копирования и т. Д.

Весь мой код теперь выглядит так:

 // get the HTML content of the file we want to convert $invoice = file_get_contents("http://www.domain.com/index.php?s=invoices-print&invoice_no=".$_GET['invoice_no']; // replace the CSS style from a print version to a specially modified PDF version $invoice = str_replace('href="design/css/base.print.css"','href="design/css/base.pdf.css"',$invoice); // write the modified file to disk file_put_contents("docs/invoices/tmp/".$_GET['invoice_no'].".html", $invoice); // do the PDF magic exec("xvfb-run wkhtmltopdf --margin-left 16 /data/web/domain.com/web/docs/invoices/tmp/".$_GET['invoice_no'].".html /data/web/domain.com/web/docs/invoices/".$_GET['invoice_no'].".pdf"); // delete the temporary HTML data - we don't need that anymore since our PDF is created unlink("docs/invoices/tmp/".$_GET['invoice_no'].".html"); // workaround the warnings error_reporting(0); // script from ID Security Suite function pdfEncrypt ($origFile, $password, $destFile){ require_once('libraries/fpdf/FPDI_Protection.php'); $pdf = new FPDI_Protection(); $pdf->FPDF('P', 'in'); //Calculate the number of pages from the original document. $pagecount = $pdf->setSourceFile($origFile); //Copy all pages from the old unprotected pdf in the new one. for ($loop = 1; $loop <= $pagecount; $loop++) { $tplidx = $pdf->importPage($loop); $pdf->addPage(); $pdf->useTemplate($tplidx); } //Protect the new pdf file, and allow no printing, copy, etc. and //leave only reading allowed. $pdf->SetProtection(array('print'), '', $password); $pdf->Output($destFile, 'F'); return $destFile; } //Password for the PDF file (I suggest using the email adress of the purchaser). $password = md5(date("Ymd")).md5(date("Ymd")); //Name of the original file (unprotected). $origFile = "docs/invoices/".$_GET['invoice_no'].".pdf"; //Name of the destination file (password protected and printing rights removed). $destFile = "docs/invoices/".$_GET['invoice_no'].".pdf"; //Encrypt the book and create the protected file. pdfEncrypt($origFile, $password, $destFile ); 

Надеюсь, это поможет кому-то сэкономить время в будущем. Это решение потребовало 12 часов для внедрения в нашу систему выставления счетов. Если бы информация о wkhtmltopdf была лучше для таких пользователей, как я, которые не знакомы с Linux / UNIX, я мог бы сэкономить несколько часов, потраченных на это.

Тем не менее – то, что тебя не убивает, делает тебя сильнее 🙂 Итак, я немного более совершенен, когда я сделал этот пробег 🙂