2010-10-21 7 views
7

Die Lösungen für die Aufgaben meiner Schule haben alle Waterstamps auf den PDFs mit unserem Benutzernamen darauf.Anwenden von Wasserzeichen auf PDF-Dateien, wenn Benutzer versuchen, die Dateien herunterzuladen

Ich frage mich, wenn Sie wissen, wie man so etwas mit PHP zu tun? Führen sie vor dem Download ein Skript aus?

Danke.

+0

Ihre Download-Skript wahrscheinlich Ihren Benutzernamen packt, ein Grundbild erzeugt und verwendet die 'pdf_php' Bibliothek das Bild auf dem PDF Schicht. – drudge

+0

Wie generieren Sie (oder planen Sie) die PDFs? Wenn Sie noch nichts getan haben, werfen Sie einen Blick auf Webkit zu PDF: http://code.google.com/p/wkhtmltopdf/ – Petah

Antwort

5

Obwohl es mehrere sehr gute PDF-Bibliotheken für PHP gibt, würde ich einfach ein Shell-Programm erstellen, um pdftk auszuführen, aber Sie müssen immer noch Ihr Wasserzeichen generieren.

$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

Benötigt, dies gestern zu tun und hier ist, wie ohne externe nicht-PHP-Bibliotheken, die installiert werden müssen. Die einzigen 2 Bibliotheken, die benötigt werden, sind PHP libs und sind leicht zu bekommen.

Jetzt kann die folgende Klasse verwenden, um eine Wasserzeichenmarkierung zu erhalten

/** 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)); 
     } 
    } 

} 

Sie können jetzt laufen diese als:

WaterMark::applyAndSpit($fileWithFullPath); 
+0

Ich benutzte dies und bekam alle Seiten auf der ersten Seite angezeigt. Ich konnte das beheben, indem ich '$ this-> pdf-> addPage();' am Ende der Schleife in 'doWaterMark()' hinzufüge. Ich habe einige andere kleinere Änderungen vorgenommen, daher bin ich nicht zuversichtlich, Ihre Antwort zu bearbeiten, aber dies kann hilfreich sein, wenn andere dieses Problem haben. –

+0

Ich habe diesen Code in Reaktion auf diese Frage (http://stackoverflow.com/q/10468478/212940) – vascowhite

+0

korrigiert. Danke für den Code. Ein paar kleine Dinge, die ich bisher gefunden habe, verhindern, dass sie plug-n-play werden. Der Befehl "run this" benötigt zwei Argumente: WaterMark :: applyAndSpit ($ fileWithFullPath, $ newfilenameWithFullPath); , und die Klasse verwendet = &, was im aktuellen PHP veraltet ist, verwende einfach =. – rpilkey