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

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

В связи с этим у меня вопрос: есть ли онлайн-демонстрации для других инструментов (например, wkhtmltopdf, т. Е.), Которые я мог бы использовать, чтобы проверить, как конвертируется мой HTML? Прежде чем провести остаток своей жизни, устанавливая и тестируя один за другим?

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

 Crontab28 мар. 2012 г., 17:43
wkhtmltopdf не требует большой установки - я думаю, что они на самом деле рекомендуют вам просто загрузить статическую 32- или 64-битную версию и использовать ее. На его тестирование должно уйти не более 2 минут, и, вероятно, это будет решение самого высокого качества. У нас есть несколько полусложных HTML / CSS, которые преобразуются в PDF для печати, и wkhtmltopdf нас еще не подвел.
 Michal28 мар. 2012 г., 18:16
Эй, ребята, спасибо, я попробую еще 2 вещи - TCPDF & wkhtmltopdf :) Вы оба правы, все вещи легко установить, но для этого нужно время, чтобы проверить это, прочитать документацию :)
 poncha28 мар. 2012 г., 18:06
wkhtmltopdf действительно прост в установке (и я думаю, что это даже статически связанный двоичный файл, поэтому никаких дополнительных библиотек не требуется) ... результат такой же, как рендеринг с помощью движка webkit (который у него под капотом - просто без головы)

Ответы на вопрос(1)

Решение Вопроса

но на вопрос выше, но я постараюсь рассказать о своем опыте, возможно, он поможет кому-нибудь где-нибудь в будущем.

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

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

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

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

Я тоже хотелзащитить сгенерированные файлы PDF от редактирования (в моем случае, защита печати также возможна). После некоторого исследования я нашелэтот класс от ID Security Suite, Прежде всего я должен сказать - ЭТО СТАРЫЙ (я использую 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, я мог бы сэкономить некоторые часы, потраченные на это.

Однако - то, что не убивает, делает тебя сильнее :) Так что теперь я немного лучше, когда я сделал этот забег :)

 a coder28 февр. 2016 г., 14:35
Вы используете SELinux в принудительном режиме?

Ваш ответ на вопрос