Как создать PDF-файл из HTML с помощью php, а затем сохранить его на сервере

У меня есть проект для сохранения страниц, созданных динамически с помощью php и их хранения на сервере.

Я планирую хранить реплику страницы в формате pdf; со всеми их изображениями, таблицами и макетом.

Я попытался использовать эти инструменты:

  • DOMPDF
  • FPDF

Но я честно не думаю, что все идет по правильному пути

Есть ли какие-либо решения или эти инструменты могут решить эту проблему?

От forosdelweb

Мы собираемся создать класс для преобразования в convertToPDF.php

<?php /*----------------------------------------------------------/* $path : name of the file pdf (without the extension) ie: --> 'ejemplo' , 'pdfs/nuevo-ejemplo' if empty --> it will be random $content : content of the pdf $body : true or false. true --> add; <doctype>, <body>, <head> to $content false --> do not alter the $content $style : the path of the CSS. It could be empty To load the css --> needs $body = true; $mode : true or false. true --> save the file on the server and then show it false --> ask where to save it $paper_1 : size of the paper[*] $paper_2 : style of the paper[*] [*] To see more options: --> http://code.google.com/p/dompdf/wiki/Usage#Invoking_dompdf_via_the_command_line /*----------------------------------------------------------*/ require_once("dompdf/dompdf_config.inc.php"); function doPDF($path='',$content='',$body=false,$style='',$mode=false,$paper_1='a4',$paper_2='portrait') { if( $body!=true and $body!=false ) $body=false; if( $mode!=true and $mode!=false ) $mode=false; if( $body == true ) { $content=' <!doctype html> <html> <head> <link rel="stylesheet" href="'.$style.'" type="text/css" /> </head> <body>' .$content. '</body> </html>'; } if( $content!='' ) { //Añadimos la extensión del archivo. Si está vacío el nombre lo creamos $path!='' ? $path .='.pdf' : $path = crearNombre(10); //Las opciones del papel del PDF. Si no existen se asignan las siguientes:[*] if( $paper_1=='' ) $paper_1='a4'; if( $paper_2=='' ) $paper_2='portrait'; $dompdf = new DOMPDF(); $dompdf -> set_paper($paper_1,$paper_2); $dompdf -> load_html(utf8_encode($content)); //ini_set("memory_limit","32M"); //opcional $dompdf -> render(); //Creamos el pdf if($mode==false) $dompdf->stream($path); //Lo guardamos en un directorio y lo mostramos if($mode==true) if( file_put_contents($path, $dompdf->output()) ) header('Location: '.$path); } } function crearNombre($length) { if( ! isset($length) or ! is_numeric($length) ) $length=6; $str = "0123456789abcdefghijklmnopqrstuvwxyz"; $path = ''; for($i=1 ; $i<$length ; $i++) $path .= $str{rand(0,strlen($str)-1)}; return $path.'_'.date("dm-Y_H-is").'.pdf'; } 

Следующий шаг – создать страницу в этом случае index.php

 <?php include('convertToPDF.php'); //$html= --> Aquí pondriamos por ejemplo la consulta $html=' <img src="http://img.ruphp.com/php/title.gif"/> <table> <tr> <th>Nombre</th> <th>Tipo</th> <th>Imagen</th> <th>Comentario</th> <th>Unidades</th> <th>Precio unidad</th> </tr> <tr> <td>pensandoo</td> <td>icono</td> <td><img src="http://img.ruphp.com/php/scratchchin.gif"/></td> <td>iconito pensativo</td> <td>3</td> <td>10</td> </tr> <tr> <td>fiesta</td> <td>icono 3</td> <td><img src="http://img.ruphp.com/php/porra.gif"/></td> <td>iconito festejando</td> <td>1</td> <td>24</td> </tr> <tr> <td>silbando</td> <td>icono</td> <td><img src="http://img.ruphp.com/php/silbar.gif"/></td> <td>bombilla silbando</td> <td>19</td> <td>50</td> </tr> <tr> <td>no no no</td> <td>icono 2</td> <td><img src="http://img.ruphp.com/php/negar.gif"/></td> <td>negacion</td> <td>5</td> <td>1</td> </tr> </table> ' ?> <?php if ( isset($_POST['PDF_1']) ) doPDF('ejemplo',$html,false); if ( isset($_POST['PDF_2']) ) doPDF('ejemplo',$html,true,'style.css'); if ( isset($_POST['PDF_3']) ) doPDF('',$html,true,'style.css'); if ( isset($_POST['PDF_4']) ) doPDF('ejemplo',$html,true,'style.css',false,'letter','landscape'); if ( isset($_POST['PDF_5']) ) doPDF('ejemplo',$html,true,'',true); //asignamos los tags <html><head>... pero no tiene css if ( isset($_POST['PDF_6']) ) doPDF('',$html,true,'style.css',true); if ( isset($_POST['PDF_7']) ) doPDF('pdfs/nuevo-ejemplo',$html,true,'style.css',true); //lo guardamos en la carpeta pdfs ?> <!doctype html> <html> <head> <link rel="stylesheet" href="style.css" type="text/css" /> </head> <table class="header"> <tr> <td><a href="http://www.forosdelweb.com/f18/" target="_blank"><h1>PHP</h1></a></td> <td><a href="http://www.forosdelweb.com/" target="_blank"><h2>FOROSDELWEB</h2></a></td> </tr> </table> <table class="menu"> <tr> <td>Ejemplos para: <strong>dompdf</strong></td> <td><a href="http://code.google.com/p/dompdf/wiki/Usage" target="_blank">Documentaci&oacute;n</a></td> <td><a href="http://code.google.com/p/dompdf/source/browse/trunk/dompdf/dompdf_config.custom.inc.php?r=399" target="_blank">Define()</a></td> <td><a href="http://pxd.me/dompdf/www/examples.php#samples" target="_blank">Ejemplos de dompdf</a></td> </tr> </table> <body> <?php echo $html ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST"> <table> <tr> <td>Mostrar PDF sin CSS</td> <td><input name="PDF_1" type="submit" value="CREAR" /></td> </tr> <tr> <td>Mostrar PDF con CSS</td> <td><input name="PDF_2" type="submit" value="CREAR" /></td> </tr> <tr> <td>Mostrar PDF con CSS sin definir el nombre</td> <td><input name="PDF_3" type="submit" value="CREAR" /></td> </tr> <tr> <td>Mostrar PDF con CSS y cambiando el formato de la hoja</td> <td><input name="PDF_4" type="submit" value="CREAR" /></td> </tr> <tr> <td>Guardar y abrir PDF sin CSS</td> <td><input name="PDF_5" type="submit" value="CREAR" /></td> </tr> <tr> <td>Guardar y abrir PDF con CSS sin definir el nombre</td> <td><input name="PDF_6" type="submit" value="CREAR" /></td> </tr> <tr> <td>Guardar en otro directorio y abrir PDF con CSS</td> <td><input name="PDF_7" type="submit" value="CREAR" /></td> </tr> </table> </form> </body> </html> в <?php include('convertToPDF.php'); //$html= --> Aquí pondriamos por ejemplo la consulta $html=' <img src="http://img.ruphp.com/php/title.gif"/> <table> <tr> <th>Nombre</th> <th>Tipo</th> <th>Imagen</th> <th>Comentario</th> <th>Unidades</th> <th>Precio unidad</th> </tr> <tr> <td>pensandoo</td> <td>icono</td> <td><img src="http://img.ruphp.com/php/scratchchin.gif"/></td> <td>iconito pensativo</td> <td>3</td> <td>10</td> </tr> <tr> <td>fiesta</td> <td>icono 3</td> <td><img src="http://img.ruphp.com/php/porra.gif"/></td> <td>iconito festejando</td> <td>1</td> <td>24</td> </tr> <tr> <td>silbando</td> <td>icono</td> <td><img src="http://img.ruphp.com/php/silbar.gif"/></td> <td>bombilla silbando</td> <td>19</td> <td>50</td> </tr> <tr> <td>no no no</td> <td>icono 2</td> <td><img src="http://img.ruphp.com/php/negar.gif"/></td> <td>negacion</td> <td>5</td> <td>1</td> </tr> </table> ' ?> <?php if ( isset($_POST['PDF_1']) ) doPDF('ejemplo',$html,false); if ( isset($_POST['PDF_2']) ) doPDF('ejemplo',$html,true,'style.css'); if ( isset($_POST['PDF_3']) ) doPDF('',$html,true,'style.css'); if ( isset($_POST['PDF_4']) ) doPDF('ejemplo',$html,true,'style.css',false,'letter','landscape'); if ( isset($_POST['PDF_5']) ) doPDF('ejemplo',$html,true,'',true); //asignamos los tags <html><head>... pero no tiene css if ( isset($_POST['PDF_6']) ) doPDF('',$html,true,'style.css',true); if ( isset($_POST['PDF_7']) ) doPDF('pdfs/nuevo-ejemplo',$html,true,'style.css',true); //lo guardamos en la carpeta pdfs ?> <!doctype html> <html> <head> <link rel="stylesheet" href="style.css" type="text/css" /> </head> <table class="header"> <tr> <td><a href="http://www.forosdelweb.com/f18/" target="_blank"><h1>PHP</h1></a></td> <td><a href="http://www.forosdelweb.com/" target="_blank"><h2>FOROSDELWEB</h2></a></td> </tr> </table> <table class="menu"> <tr> <td>Ejemplos para: <strong>dompdf</strong></td> <td><a href="http://code.google.com/p/dompdf/wiki/Usage" target="_blank">Documentaci&oacute;n</a></td> <td><a href="http://code.google.com/p/dompdf/source/browse/trunk/dompdf/dompdf_config.custom.inc.php?r=399" target="_blank">Define()</a></td> <td><a href="http://pxd.me/dompdf/www/examples.php#samples" target="_blank">Ejemplos de dompdf</a></td> </tr> </table> <body> <?php echo $html ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST"> <table> <tr> <td>Mostrar PDF sin CSS</td> <td><input name="PDF_1" type="submit" value="CREAR" /></td> </tr> <tr> <td>Mostrar PDF con CSS</td> <td><input name="PDF_2" type="submit" value="CREAR" /></td> </tr> <tr> <td>Mostrar PDF con CSS sin definir el nombre</td> <td><input name="PDF_3" type="submit" value="CREAR" /></td> </tr> <tr> <td>Mostrar PDF con CSS y cambiando el formato de la hoja</td> <td><input name="PDF_4" type="submit" value="CREAR" /></td> </tr> <tr> <td>Guardar y abrir PDF sin CSS</td> <td><input name="PDF_5" type="submit" value="CREAR" /></td> </tr> <tr> <td>Guardar y abrir PDF con CSS sin definir el nombre</td> <td><input name="PDF_6" type="submit" value="CREAR" /></td> </tr> <tr> <td>Guardar en otro directorio y abrir PDF con CSS</td> <td><input name="PDF_7" type="submit" value="CREAR" /></td> </tr> </table> </form> </body> </html> 

Наконец, у вас может быть файл для вашего стиля style.css

 body{ font:12px Arial, Tahoma, Verdana, Helvetica, sans-serif; background-color:#BECEDC; color:#000; } a h1{ font-size:35px; color:#FFF; } h2{ color:#FC0; font-size:15px; } table{ width:100%; height:auto; margin:10px 0 10px 0; border-collapse:collapse; text-align:center; background-color:#365985; color:#FFF; } table td,th{ border:1px solid black; } table th{ color:#FC0; } .menu{ background-color:#69C; color:#FFF; } .menu a{ color:#FFF; } 

Недавно у меня была такая же проблема, и я нашел fpdf слишком сложным, когда ваш HTML содержит форматированный текст и изображения. У меня был установлен администратор сервера Webkit HTML для PDF. Он отлично работает.

Этот пакет будет анализировать таблицу стилей, изображения, таблицы и любой другой элемент документа HTML, как если бы вы открыли веб-браузер с помощью webkit и сохранили веб-страницу в формате PDF.

http://code.google.com/p/wkhtmltopdf/

 /** * Use wkhtmltopdf to convert an HTML file to PDF * * @param string URL to web page * @param string Path to PDF file to be written * * @return boolean True if the command succeeded; false otherwise */ function htmlToPdf($source, $dest) { // Build command $command = "/usr/bin/wkhtmltopdf $source $dest 2>&1"; exec($command, $output); $s = sizeof($output) - 1; if (substr($output[$s], -4, 4) == 'Done') { return true; } return false; }