问题
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, tables and the layout.
I tried to use these tools:
- DOMPDF
- FPDF
But I honestly do not think it's going on the right track
Have any solutions or could these tools solve this problem?
回答1:
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ó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;
}
回答2:
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;
}
来源:https://stackoverflow.com/questions/13593870/how-to-create-a-pdf-file-from-an-html-using-php-and-then-save-it-on-the-server