简体   繁体   English

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

[英]How to create a pdf file from an HTML using php, and then save it on the server

I have a project to save pages created dynamically with php and store them on the server.我有一个项目来保存用 php 动态创建的页面并将它们存储在服务器上。

I am planning to store a replica of the page as a pdf;我打算将页面的副本存储为 pdf; with all their images, tables and the layout.以及他们所有的图像、表格和布局。

I tried to use these tools:我尝试使用这些工具:

But I honestly do not think it's going on the right track但老实说,我不认为它走在正确的轨道上

Have any solutions or could these tools solve this problem?有什么解决方案或者这些工具可以解决这个问题吗?

I had this same issue recently and found fpdf to be too complicated when your HTML contains formatted text and images.我最近遇到了同样的问题,当您的 HTML 包含格式化文本和图像时,我发现 fpdf 太复杂了。 I had my server admin install Webkit HTML to PDF.我让我的服务器管理员将 Webkit HTML 安装到 PDF。 It works great.它工作得很好。

This package will parse the stylesheet, images, tables, and any other element in the HTML document as if you had opened a web browser using webkit and saved the web page as a PDF.该包将解析 HTML 文档中的样式表、图像、表格和任何其他元素,就像您使用 webkit 打开 Web 浏览器并将网页保存为 PDF 一样。

http://code.google.com/p/wkhtmltopdf/ 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;
}

From forosdelweb来自forosdelweb

We are going to create a class to make the convertion in convertToPDF.php我们将在 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';     
} 

The next step is to create a page in this case index.php下一步是在这种情况下创建一个页面 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> 

Finally you can have the file for your style style.css最后,您可以拥有样式 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; 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM