如何使用php从HTML创建pdf文件,然后将其保存在服务器上

时间:2012-11-27 21:57:06

标签: php fpdf dompdf

我有一个项目来保存使用php动态创建的页面并将它们存储在服务器上。

我打算将该页面的副本存储为pdf;包括他们所有的图像,表格和布局。

我尝试使用这些工具:

但老实说,我认为它没有走上正轨

有任何解决方案或这些工具可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我最近遇到了同样的问题,当你的HTML包含格式化的文本和图像时,发现fpdf太复杂了。我让我的服务器管理员将Webkit HTML安装到PDF。它很棒。

此包将解析HTML文档中的样式表,图像,表格和任何其他元素,就像您使用webkit打开Web浏览器并将网页另存为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;
}

答案 1 :(得分:1)

来自forosdelweb

我们将创建一个类来在convertToPDF.php中进行转换

<?php 
/*----------------------------------------------------------/* 

$path     : name of the file pdf (without the extension) 
                i.e.: --> '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("d-m-Y_H-i-s").'.pdf';     
} 

下一步是在这种情况下创建一个页面index.php

<?php 

include('convertToPDF.php'); 

//$html= --> Aquí pondriamos por ejemplo la consulta 
$html=' 
<img src="http://pxd.me/dompdf/www/images/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://static.forosdelweb.com/fdwtheme/images/smilies/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://static.forosdelweb.com/fdwtheme/images/smilies/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://static.forosdelweb.com/fdwtheme/images/smilies/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://static.forosdelweb.com/fdwtheme/images/smilies/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; 
}