2010-10-21 4 views
7

Les solutions pour les affectations de mon école ont toutes des waterstamps sur les PDF avec notre nom d'utilisateur.Application de filigranes sur des fichiers PDF lorsque les utilisateurs tentent de télécharger les fichiers

Je me demandais si vous saviez comment faire quelque chose comme ça en utilisant PHP? Est-ce qu'ils exécutent un script avant le processus de téléchargement?

Merci.

+0

Leur script downloader saisit probablement votre nom d'utilisateur, crée une image de base, et utilise la bibliothèque 'pdf_php' à la couche cette image au-dessus du PDF. – drudge

+0

Comment générez-vous (ou planifiez) les fichiers PDF? Si vous n'avez encore rien fait, jetez un oeil à Webkit en PDF: http://code.google.com/p/wkhtmltopdf/ – Petah

Répondre

5

Bien qu'il existe plusieurs très bonnes librairies PDF pour PHP, si j'écrivais un tel programme, je débuterais juste pour exécuter pdftk mais vous devez toujours générer votre filigrane.

$tempfile=tempnam(); 
system("pdftk input_file.pdf background watermark.pdf output $tempfile dont_ask", $errcode); 
if (!$errcode && $ih=fopen($tempfile, 'r')) { 
    header('Content-Type: application/pdf'); 
    fpassthru($ih); 
    fclose($ih); 
} else { 
    print "Whoops"; 
} 
unlink($tempfile); 
4

Nécessaire de faire cela hier et voici comment sans bibliothèques externes non-PHP qui doivent être installés. Les deux seules bibliothèques nécessaires sont les deux bibliothèques PHP et sont faciles à obtenir.

Maintenant, vous pouvez utiliser la classe ci-dessous pour réaliser le filigranage

/** MAKE SURE TO HAVE THE INCLUDES RUNNING PROPERLY */ 
require_once('FPDF/fpdf.php'); 
require_once('FPDI/fpdi.php'); 

class WaterMark 
{ 
    public $pdf, $file, $newFile, 
     $wmText = "STACKOVERFLOW"; 

    /** $file and $newFile have to include the full path. */ 
    public function __construct($file, $newFile) 
    { 
     $this->pdf =& new FPDI(); 
     $this->file = $file; 
     $this->newFile = $newFile; 
    } 

    /** $file and $newFile have to include the full path. */ 
    public static function applyAndSpit($file, $newFile) 
    { 
     $wm = new WaterMark($file, $newFile); 

     if($wm->isWaterMarked()) 
      return $wm->spitWaterMarked(); 
     else{ 
      $wm->doWaterMark(); 
      return $wm->spitWaterMarked(); 
     } 
    } 

    /** @todo Make the text nicer and add to all pages */ 
    public function doWaterMark() 
    { 
     $currentFile = $this->file; 
     $newFile = $this->newFile; 

     $pagecount = $this->pdf->setSourceFile($currentFile); 

     for($i = 1; $i <= $pagecount; $i++){ 
          $this->pdf->addPage(); 
      $tplidx = $this->pdf->importPage($i); 
      $this->pdf->useTemplate($tplidx, 10, 10, 100); 
      // now write some text above the imported page 
      $this->pdf->SetFont('Arial', 'I', 40); 
      $this->pdf->SetTextColor(255,0,0); 
      $this->pdf->SetXY(25, 135); 
      $this->_rotate(55); 
      $this->pdf->Write(0, $this->wmText); 
          $this->_rotate(0); 
     } 

     $this->pdf->Output($newFile, 'F'); 
    } 

    public function isWaterMarked() 
    { 
     return (file_exists($this->newFile)); 
    } 

    public function spitWaterMarked() 
    { 
     return readfile($this->newFile); 
    } 

    protected function _rotate($angle,$x=-1,$y=-1) { 

     if($x==-1) 
      $x=$this->pdf->x; 
     if($y==-1) 
      $y=$this->pdf->y; 
     if($this->pdf->angle!=0) 
      $this->pdf->_out('Q'); 
     $this->pdf->angle=$angle; 

     if($angle!=0){ 
      $angle*=M_PI/180; 
      $c=cos($angle); 
      $s=sin($angle); 
      $cx=$x*$this->pdf->k; 
      $cy=($this->pdf->h-$y)*$this->pdf->k; 

      $this->pdf->_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)); 
     } 
    } 

} 

Vous pouvez maintenant exécuter ce que:

WaterMark::applyAndSpit($fileWithFullPath); 
+0

J'ai utilisé ceci et obtenait toutes les pages affichées sur la première page. J'ai été capable de résoudre ce problème en ajoutant '$ this-> pdf-> addPage();' à la fin de la boucle dans 'doWaterMark()'. J'ai apporté d'autres modifications mineures, donc je ne suis pas sûr d'éditer votre réponse, mais cela peut aider si d'autres ont ce problème. –

+0

J'ai corrigé ce code en réponse à [cette question] (http://stackoverflow.com/q/10468478/212940) – vascowhite

+0

Merci pour le code. Quelques petites choses que j'ai trouvées jusqu'ici qui empêchent cela d'être plug-n-play. La commande "run this" nécessite deux arguments: WaterMark :: applyAndSpit ($ fileWithFullPath, $ newfilenameWithFullPath); , et la classe utilise = &, qui est dépréciée dans le php actuel, utilisez simplement =. – rpilkey

Questions connexes