2013-06-25 2 views
0

Я работаю над проектом Symfony 1.4. Мне нужно сделать ссылку для загрузки в PDF для ваучера (пока еще), и я должен сказать, что я немного смущен. У меня уже есть HTML/CSS для ваучера, я создал кнопку загрузки в правом представлении, но я не знаю, куда идти оттуда.Создать PDF из HTML/CSS/PHP в Symfony 1.4

ответ

0
Use Mpdf to create the pdf file 
http://www.mpdf1.com/ 
+1

Также можно посмотреть на dompdf и tcpdf – Dave

+0

Теперь я пытаюсь использовать tcpdf. Я выполнил инструкции по этой [ссылке] (http://www.symfony-project.org/plugins/sfTCPDFPlugin), но как включить модуль 'sfTCPDF' в файле' settings.yml'? – halpsb

+0

Вам не нужно менять settings.yml, просто добавьте/включите плагин в файле ProjectConfiguration. Следуйте настройке установки файла README, чтобы настроить его правильно и очистить кеш Symfony. – xtrm

0

Использовать wkhtmltopdf, если возможно. Это, безусловно, лучший html2pdf конвертер, который может использовать php-кодер.

А потом сделать что-то вроде этого (не проверял, но должно быть довольно близко):

public function executeGeneratePdf(sfWebRequest $request) 
{ 
    $this->getContext()->getResponse()->clearHttpHeaders(); 

    $html = '*your html content*'; 
    $pdf = new WKPDF(); 
    $pdf->set_html($html); 
    $pdf->render(); 

    $pdf->output(WKPDF::$PDF_EMBEDDED, 'whatever_name.pdf'); 

    throw new sfStopException(); 
} 
0

+1 с wkhtmltopdf

Я даже Recommand в snappy библиотеку. Если вы используете composer, вы можете даже получить wkhtmltopdf двоичные файлы автоматически

0

Использовав wkhtmltopdf некоторое время я переехал от него, как 1) она имеет некоторые серьезные ошибки и 2) постоянное развитие замедлилось. Я перешел на PhantomJS, который оказался намного лучше с точки зрения функциональности и эффективности.

Как только у вас на компьютере есть что-то вроде wkhtmltopdf или PhantomJS, вам нужно сгенерировать HTML-страницу и передать ее вместе с ней. Я приведу вам пример, предполагающий, что вы используете PhantomJS.

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

$this->getRequest->setParamater([some parameter],[some value]); 

Затем вызовите функцию getPresentation() для генерации HTML из шаблона. Это вернет полученный HTML-код для конкретного модуля и действия.

$html = sfContext::getInstance()->getController()->getPresentation([module],[action]); 

Вам нужно будет заменить относительные пути CSS абсолютным путем CSS в файле HTML. Например, запустив preg_replace.

$html_replaced = preg_replace('/"\/css/','"'.sfConfig('sf_web_dir').'/css',$html); 

Теперь напишите HTML-страницу для преобразования в PDF-файл.

$fp = fopen('export.html','w+'); 
fwrite($fp,$html_replaced); 
fclose($fp) 
exec('/path/to/phantomjs/bin/phantomjs /path/to/phantomjs/examples/rasterize.js /path/to/export.html /path/to/export.pdf "A3"); 

Теперь отправить PDF пользователю:

$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setHttpHeader('Content-Description','File Transfer'); 
$this->getResponse()->setHttpHeader('Cache-Control','public, must-revalidate, max-age=0'); 
$this->getResponse()->setHttpHeader('Pragma: public',true); 
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding','binary'); 
$this->getResponse()->setHttpHeader('Content-length',filesize('/path/to/export.pdf')); 
$this->getResponse()->setContentType('application/pdf'); 
$this->getResponse()->setHttpHeader('Content-Disposition','attachment; filename=export.pdf'); 

$this->getResponse()->setContent(readfile('/path/to/export.pdf')); 
$this->getResponse()->sendContent(); 

Вам необходимо установить заголовки в противном случае браузер делает странные вещи. Имя файла для сгенерированного HTML-файла и экспорта должно быть уникальным, чтобы избежать ситуации, когда два человека генерируют PDF-ваучеры, одновременно сталкиваясь. Вы можете использовать что-то вроде sha1(time()), чтобы добавить рандомизированный хеш к стандартному имени, например. 'export_'.sha1(time());

Смежные вопросы