我学校作业的解决方案都在PDF上印有水印,并在上面印有我们的用户名。
我想知道你们是否知道如何使用PHP做类似的事情?他们在下载过程之前运行脚本吗?
谢谢。
尽管有一些非常好的PHP PDF格式的库,但是如果我正在编写这样的程序,我将只运行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);
昨天需要这样做,这是不需要安装任何外部非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);
有一个出色的开源php库http://www.tcpdf.org/,我将其用于所有pdf生成任务。
以下是我尝试使用fpdi进行水印的步骤:
<?php
use setasign\Fpdi\Fpdi;
use setasign\Fpdi\PdfReader;
function PlaceWatermark($file, $text, $xxx, $yyy, $op, $outdir) {
require_once('fpdi/vendor/autoload.php');
require_once 'fpdi/vendor/setasign/fpdf/fpdf.php';
function copyTransparent($src, $output)
{
$dimensions = getimagesize($src);
$x = $dimensions[0];
$y = $dimensions[1];
$im = imagecreatetruecolor($x,$y);
$src_ = imagecreatefrompng($src);
// Prepare alpha channel for transparent background
$alpha_channel = imagecolorallocatealpha($im, 255, 255, 255, 127);
imagecolortransparent($im, $alpha_channel);
// Fill image
imagefill($im, 0, 0, $alpha_channel);
// Copy from other
imagecopy($im,$src_, 0, 0, 0, 0, $x, $y);
// Save transparency
imagesavealpha($im,true);
// Save PNG
imagepng($im,$output,9);
imagedestroy($im);
}
$png = 'https://www.office-deals.nl/images/logo_60x37.png';
copyTransparent($png,"png.png");
$imageURL = 'png.png';
$imgWidth = 20;
$pdf = new FPDI();
if (file_exists("./".$file)){
$pagecount = $pdf->setSourceFile($file);
} else {
return FALSE;
}
for($i=1; $i <= $pagecount; $i++) {
$tpl = $pdf->importPage($i);
$pdf->addPage();
$pdf->useTemplate($tpl, 5, 5);
$pdf->Image($imageURL, $xxx, $yyy,'png');
}
if ($outdir === TRUE){
return $pdf->Output($file,'I');
} else {
return $pdf->Output();
}
}
$images='https://www.office-deals.nl/images/logo_60x37.png';
PlaceWatermark("laravel.pdf", $images, 180, 275, 100,TRUE);
?>