TU ANUNCIO / YOUR PUBLICITY

AQUÍ PODRÍA ESTAR TU ANUNCIO: / HERE COULD BE YOUR AD E-mail

domingo, 16 de marzo de 2014

Cómo usar ZEND para modificar PDFs con PHP

1º Instalamos ZEND o lo colocamos en un directorio determindo:

En el ejemplo se situa en el subdiretorio zend dentro del directorio de trabajo de php:

require_once 'Zend/Pdf.php';
$pdf = Zend_Pdf::load($Archivo_a_modificar);

$page = $pdf->pages[0];
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);
$page->setFont($font,14);
$page->drawText($y_expediente, 450, 733);

$page2 = $pdf->pages[2];
$image = Zend_Pdf_Image::imageWithPath("/xxxx.png");
$font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
$page2->setFont($font2,14);
$page2->drawText($variableString, 262, 734);
$page2->drawImage($image, $xx,$yy,$ancho,$alto);
… etc …
// $pdf->save("/destino.pdf");
$pdfData = $pdf->render();

header("Content-Disposition: inline; filename=result.pdf");
header("Content-type: application/x-pdf");
echo $pdfData; 


LOS PROBLEMAS DE ZEND AL ABRIR ALGUNOS ARCHIVOS PDF

A veces, el framework de Zend tiene algún problema al abrir un archivo pdf. En nuestro programa de php:

<?php
...
$pdf1 = new Zend_Pdf();

$pdf2 = Zend_Pdf::load($archivo_pdf);

...
?>

No voy a preguntarme el motivo por lo que esto ocurre pero el caso es que es así. Por otra parte, si volvemos a imprimir el pdf en cualquier editor de pdf de nuevo en pdf (perdón por las redundancias) sí admite sin problemas el nuevo archivo. La idea que se ocurre es reimprimir el fichero pdf que da problemas en pdf y así eliminar el problema con el pdf original.

¿Cómo lo hacemos?

Como todo va a ser en línea de comandos lo mejor es disponer de una impresora y una impresión accesible en línea de comandos.

1º Impresora: ¿tenemos alguna impresora que emita pdfs? 
ejecutamos:

 lpstat -p -d 

y el resultado es algo así:
la impresora XXXXX está inactiva.  activada desde jue 20 oct 2011 12:01:46 CEST
destino predeterminado del sistema: XXXXX

En ese caso no tenemos algo reconocible en pdf.

2º Instalamos la impresora en pdf
sudo apt-get -y install cups-pdf
Después:
 lpstat -p -d
la impresora XXXXX está inactiva.  activada desde lun 04 mar 2013 12:46:05 CET
la impresora Generic-CUPS-PDF-Printer está inactiva.  activada desde lun 04 mar 2013 12:42:31 CET
destino predeterminado del sistema: Generic-CUPS-PDF-Printer

3º Tenemos que controlar donde imprimirá el nuevo pdf:

sudo gedit /etc/cups/cups-pdf.conf

el alguna línea estará:

Out ${HOME}/PDF

se cambia por

#Out ${HOME}/PDF
Out $/directorio/salida/PDF

La razón es porque muchas veces no se tiene controlado cual el el directorio {home} para www-data (usuario de apache).

4º Modificamos nuestro programa


<?php
...
$pdf1 = new Zend_Pdf();

exec("lp -d Generic-CUPS-PDF-Printer $archivo_pdf");
$nuevo_pdf="/directorio/salida/PDF".basename($archivo_pdf);
sleep(10);
$pdf2 = Zend_Pdf::load($nuevo_pdf);

...
unlink($nuevo);
?>

Expliquemos la modificación del programa:

Tomamos el archivo que da problemas ($archivo_pdf). Lo imprimimos (comando lp) en la impresora CUPS-PDF. Le hacemos esperar 10 segundos (sleep) al programa para darle tiempo a crearlo y guardarlo en /directorio/salida/PDF/ con el mismo nombre (sin las coletillas de directorios). Abre el nuevo archivo ($nuevo_pdf) que no dará problemas y al final borramos el archivo que nos sirvió de puente(unlink).

para más seguridad se puede poner (en vez de sleep(10)):

do{sleep(1);}while (not is_file($nuevo));

No hay comentarios:

Publicar un comentario