Применение водяных знаков к файлам PDF, когда пользователи пытаются загрузить файлы - PullRequest
7 голосов
/ 21 октября 2010

Решения для школьных заданий имеют водяные отметки в PDF-файлах с нашим именем пользователя.

Мне было интересно, знаете ли вы, ребята, как сделать что-то подобное с помощью PHP? Они запускают сценарий до процесса загрузки?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 21 октября 2010

Хотя есть несколько очень хороших PDF-библиотек для PHP, если бы я писал такую ​​программу, я бы просто выложил для запуска pdftk , но вам все равно нужно сгенерировать свой водяной знак.

$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);
5 голосов
/ 14 февраля 2011

Требуется сделать это вчера, и вот как без каких-либо внешних библиотек не-PHP, которые должны быть установлены. Нужны только 2 библиотеки, которые являются PHP-библиотеками и их легко получить.

Теперь вы можете использовать приведенный ниже класс для создания водяных знаков

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

}

Теперь вы можете запустить это как:

WaterMark::applyAndSpit($fileWithFullPath);
2 голосов
/ 21 октября 2010

Есть отличная PHP-библиотека с открытым исходным кодом http://www.tcpdf.org/, я использую ее для всех задач по генерации PDF.

...