FPDF Carga de pdf de servidor con marca de agua y protección contra modificación
Programacion PHP 28 de Noviembre del 2010Tweet
A veces es necesario generar archivos en formato .pdf protegidos contra modificaciones y con una marca de agua en cada una de sus páginas. En este artículo explicaré como hacerlo, valiéndonos de las clases FPDF16 y FPDI_1.3.3. Fijaros que no vamos a generar un pdf al vuelo sinó que vamos a cargar uno ubicado físicamente en el server al que añadiremos la marca de agua y la protección.
La clase FPDF16 y la clase FPDI
La clase FPDF16 la podéis descargar de la página http://www.fpdf.org y la clase FPDI de la página http://www.setasign.de
Como la clase FPDI extiende la FPDF_TPL deberemos descargar también esta clase de la misma página.
class FPDI extends FPDF_TPL {
}
// La clase FPDF_TPL extiende por defecto la clase FPDF pero cambiaremos esto a como sigue:
class FPDF_TPL extends PDF_Rotate {
}
Crearemos el archivo rotation.php que contendrá la clase PDF_Rotate con el contenido que hay a continuación:
rotation.php <—– Creamos este archivo
class PDF_Rotate extends FPDF
{
var $angle=0;
function Rotate($angle,$x=-1,$y=-1)
{
if($x==-1)
$x=$this->x;
if($y==-1)
$y=$this->y;
if($this->angle!=0)
$this->_out(‘Q’);
$this->angle=$angle;
if($angle!=0)
{
$angle*=M_PI/180;
$c=cos($angle);
$s=sin($angle);
$cx=$x*$this->k;
$cy=($this->h-$y)*$this->k;
$this->_out(sprintf(‘q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm’,$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy));
}
}
function _endpage()
{
if($this->angle!=0)
{
$this->angle=0;
$this->_out(‘Q’);
}
parent::_endpage();
}
}
Ahora solo nos queda desde donde queramos, instanciar la clase FPDI_Protection para generar nuestro archivo pdf, con marca de agua y protegido contra modificaciones.
IMPORTANTE: Fijaros que no estamos generando un archivo pdf al vuelo sino que lo que hacemos es cargar un archivo ya existente en el servidor en una plantilla de FPDF_TPL y modificarlo para protegerlo contra escritura y añadirle marcas de agua. Esto es interesante cuando no tenemos el contenido del archivo pdf en la base de datos sino que reside físicamente en un archivo pdf en el servidor.
/* CODIGO QUE GENERA EL PDF CON LA MARCA DE AGUA */
$pdf = new FPDI_Protection();
$pdf->SetProtection(array(‘print’));
// set the sourcefile
$count_pages=$pdf->setSourceFile(RUTA_UPLOADS_DOCUMENTOS.’directorio/’.$nombre_archivo); // contamos las páginas del archivo en cuestión, ubicado en el server.
for($i=1;$i<=$count_pages;$i++){
$pdf->AddPage();
$x=20;
$y=100;
$angle=45;
//Image rotated around its upper-left corner
$pdf->Rotate($angle,$x,$y);
$pdf->Image(‘/var/www/sitio/web/images/marca_agua.jpg’,$x,$y,100,22);
$pdf->Rotate(0);
// import page 1
$tplIdx = $pdf->importPage($i);
// use the imported page and place it at point 10,10 with a width of 100 mm
$pdf->useTemplate($tplIdx, 10, 10, 190);
$pdf->SetFont(‘Arial’,”,10);
$pdf->SetTextColor(255,0,0);
$pdf->SetXY(5, 5);
$pdf->Write(0, date(‘d/m/Y H:m’).” MI SITIO (“.$usuario->getLogin().”)”); // Añadimos también en las cabeceras de las páginas el sitio y el
//usuario que realiza la descarga
}
$pdf->Output($nombre_archivo, ‘D’);
Computer
Hola, Y en caso de que el PDF tenga que crearlo con información de la Base de datos, cómo le agrego la marca de agua (el archivo no estaría creado anteriormente) ??
Gracias.