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

前端 未结 2 883
时光说笑
时光说笑 2021-02-06 18:06

I have a project to save pages created dynamically with php and store them on the server.

I am planning to store a replica of the page as a pdf; with all their images, t

相关标签:
2条回答
  • 2021-02-06 18:13

    From forosdelweb

    We are going to create a class to make the convertion in 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

    <?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

    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; 
    }
    
    0 讨论(0)
  • 2021-02-06 18:35

    I had this same issue recently and found fpdf to be too complicated when your HTML contains formatted text and images. I had my server admin install Webkit HTML to 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.

    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;
    }
    
    0 讨论(0)
提交回复
热议问题