PHPで動的に作成されたページを保存し、サーバーに保存するプロジェクトがあります。
ページのレプリカを pdf として保存する予定です。すべての画像、表、レイアウトを含む。
これらのツールを使用しようとしました:
しかし、正直なところ、それが正しい方向に進んでいるとは思えません
解決策はありますか、またはこれらのツールでこの問題を解決できますか?
最近同じ問題が発生し、HTML に書式設定されたテキストと画像が含まれている場合、fpdf が複雑すぎることがわかりました。サーバー管理者に Webkit HTML to PDF をインストールしてもらいました。それはうまくいきます。
このパッケージは、webkit を使用して Web ブラウザーを開き、Web ページを PDF として保存したかのように、HTML ドキュメント内のスタイルシート、画像、表、およびその他の要素を解析します。
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;
}
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ó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;
}