2010-05-26 76 views
11

Necesito agregar una marca de agua a un archivo PDF existente usando PHP. He buscado en Google, pero no he podido encontrar ninguna biblioteca adecuada.¿Cómo puedo agregar una marca de agua a un archivo PDF existente usando PHP?

Encontré la biblioteca fpdf que crea miniaturas de vista previa de archivos PDF, pero no sé si agrega marcas de agua a archivos PDF existentes o no. ¿Alguien puede sugerir una biblioteca PHP que pueda mostrar una vista previa y agregar marcas de agua a los archivos PDF existentes?

Respuesta

1

lo obtuve con la ayuda de Mark aquí vamos http://www.fpdf.de/downloads/addons/9/ si ustedes piensan que sí, es que marcaré mi respuesta como ganadora.

Gracias Jyelton para la respuesta a mi pregunta parece flujo stackover está inactivo ....

9

Sólo un ejemplo quick'n'dirty usando FPDF y las clases FPDI:

function PlaceWatermark($file, $text, $xxx, $yyy, $op, $outdir) { 
    require_once('fpdf.php'); 
    require_once('fpdi.php'); 
    $name = uniqid(); 
    $font_size = 5; 
    $ts=explode("\n",$text); 
    $width=0; 
    foreach ($ts as $k=>$string) { 
     $width=max($width,strlen($string)); 
    } 
    $width = imagefontwidth($font_size)*$width; 
    $height = imagefontheight($font_size)*count($ts); 
    $el=imagefontheight($font_size); 
    $em=imagefontwidth($font_size); 
    $img = imagecreatetruecolor($width,$height); 
    // Background color 
    $bg = imagecolorallocate($img, 255, 255, 255); 
    imagefilledrectangle($img, 0, 0,$width ,$height , $bg); 
    // Font color 
    $color = imagecolorallocate($img, 0, 0, 0); 
    foreach ($ts as $k=>$string) { 
     $len = strlen($string); 
     $ypos = 0; 
     for($i=0;$i<$len;$i++){ 
      $xpos = $i * $em; 
      $ypos = $k * $el; 
      imagechar($img, $font_size, $xpos, $ypos, $string, $color); 
      $string = substr($string, 1);  
     } 
    } 
    imagecolortransparent($img, $bg); 
    $blank = imagecreatetruecolor($width, $height); 
    $tbg = imagecolorallocate($blank, 255, 255, 255); 
    imagefilledrectangle($blank, 0, 0,$width ,$height , $tbg); 
    imagecolortransparent($blank, $tbg); 
    if (($op < 0) OR ($op >100)){ 
     $op = 100; 
    } 
    imagecopymerge($blank, $img, 0, 0, 0, 0, $width, $height, $op); 
    imagepng($blank,$name.".png"); 
    // Created Watermark Image 
    $pdf = new FPDI(); 
    if (file_exists("./".$file)){ 
     $pagecount = $pdf->setSourceFile($file); 
    } else { 
     return FALSE; 
    } 
    $tpl = $pdf->importPage(1); 
    $pdf->addPage(); 
    $pdf->useTemplate($tpl, 1, 1, 0, 0, TRUE); 
    //Put the watermark 
    $pdf->Image($name.'.png', $xxx, $yyy, 0, 0, 'png'); 
    if ($outdir === TRUE){ 
     return $pdf->Output(); 
    } else { 
     return $pdf; 
    } 
} 

PlaceWatermark("filename.pdf", "This is a lazy, but still simple test\n This should stand on a new line!", 30, 120, 100,TRUE); 

Uso: PlaceWatermark($filename, $text, $x, $y, $opacity, $directoutput);

$filename - el camino del PDF en el que desea colocar la marca de agua
$text - el texto de marca de agua que desea añadir
$x - coordenada x en la que desea colocar la marca de agua
$y - coordenada y en la que desea colocar la marca de agua
$opacity - Opacidad del texto
$directoutput - Si la función TRUE de salida de un archivo PDF, de lo contrario se devuelve $ pdf
Como ya he dicho, este es un ejemplo muy rápido y sucio, necesita algunas mejoras.

+1

El código solo funciona en una página. ¿Cómo puedo cambiar el código para admitir más páginas de entrada? – jonasl

+0

Solo hace la página 1. Para arreglar el cambio $ tpl = $ pdf-> importPage (1); $ pdf-> addPage(); $ pdf-> useTemplate ($ tpl, 1, 1, 0, 0, TRUE); –

5

Para cualquier otra persona que se topa con este post que puede generar más páginas utilizando un bucle

for($i=1; $i <= $pagecount; $i++) { 
    $tpl = $pdf->importPage($i);  
    $pdf->addPage();  
    $pdf->useTemplate($tpl, 1, 1, 0, 0, TRUE);  
    //Put the watermark 
    $pdf->Image($name.'.png', $xxx, $yyy, 0, 0, 'png');} 
+1

Es un enlace muerto. –

0
/* index.php */ 
    require('rotation.php'); 

    class PDF extends PDF_Rotate{ 
      protected $_outerText1;// dynamic text 
     protected $_outerText2; 

     function setWaterText($txt1="", $txt2=""){ 
      $this->_outerText1 = $txt1; 
      $this->_outerText2 = $txt2; 
     } 

     function Header(){ 
      //Put the watermark 
      $this->SetFont('Arial','B',40); 
      $this->SetTextColor(255,192,203); 
        $this->SetAlpha(0.5); 
      $this->RotatedText(35,190, $this->_outerText1, 45); 
      $this->RotatedText(75,190, $this->_outerText2, 45); 
     } 

     function RotatedText($x, $y, $txt, $angle){ 
      //Text rotated around its origin 
      $this->Rotate($angle,$x,$y); 
      $this->Text($x,$y,$txt); 
      $this->Rotate(0); 
     } 
    } 

    $file = "path/filename.pdf";// path: file name 
    $pdf = new PDF(); 

    if (file_exists($file)){ 
     $pagecount = $pdf->setSourceFile($file); 
    } else { 
     return FALSE; 
    } 

    $pdf->setWaterText("w a t e r M a r k d e m o ", "s e c o n d L i n e o f t e x t"); 

    /* loop for multipage pdf */ 
    for($i=1; $i <= $pagecount; $i++) { 
    $tpl = $pdf->importPage($i);    
    $pdf->addPage(); 
    $pdf->useTemplate($tpl, 1, 1, 0, 0, TRUE); 
    } 
    $pdf->Output(); //specify path filename to save or keep as it is to view in browser 

/* rotation.php */ 
    require('fpdf.php'); 
require('fpdi.php'); 
class PDF_Rotate extends FPDI 
{ 
    var $angle=0; 
    var $extgstates = array(); 

    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(); 
    } 

    function SetAlpha($alpha, $bm='Normal') 
    { 
     // set alpha for stroking (CA) and non-stroking (ca) operations 
     $gs = $this->AddExtGState(array('ca'=>$alpha, 'CA'=>$alpha, 'BM'=>'/'.$bm)); 
     $this->SetExtGState($gs); 
    } 

    function AddExtGState($parms) 
    { 
     $n = count($this->extgstates)+1; 
     $this->extgstates[$n]['parms'] = $parms; 
     return $n; 
    } 

    function SetExtGState($gs) 
    { 
     $this->_out(sprintf('/GS%d gs', $gs)); 
    } 

    function _enddoc() 
    { 
     if(!empty($this->extgstates) && $this->PDFVersion<'1.4') 
      $this->PDFVersion='1.4'; 
     parent::_enddoc(); 
    } 

    function _putextgstates() 
    { 
     for ($i = 1; $i <= count($this->extgstates); $i++) 
     { 
      $this->_newobj(); 
      $this->extgstates[$i]['n'] = $this->n; 
      $this->_out('<</Type /ExtGState'); 
      foreach ($this->extgstates[$i]['parms'] as $k=>$v) 
       $this->_out('/'.$k.' '.$v); 
      $this->_out('>>'); 
      $this->_out('endobj'); 
     } 
    } 

    function _putresourcedict() 
    { 
     parent::_putresourcedict(); 
     $this->_out('/ExtGState <<'); 
     foreach($this->extgstates as $k=>$extgstate) 
      $this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R'); 
     $this->_out('>>'); 
    } 

    function _putresources() 
    { 
     $this->_putextgstates(); 
     parent::_putresources(); 
    } 

} 

tratar guión this.modified de ejemplo FPDF guiones. Editar: Opacidad agregada use $ this-> SetAlpha (0.5)

Cuestiones relacionadas