gpt4 book ai didi

php - FPDI/FPDF : Watermark and Print Multiple Pages

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:23 31 4
gpt4 key购买 nike

我修改了这个堆栈问题:Applying watermarks on pdf files when users try to download the files但是我遇到了一个错误,虽然有一条评论说如何修复它,但它不够详细。

代码如下:

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;

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

for($i = 1; $i <= $pagecount; $i++){
$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->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));
}
}

}
header('Content-type: application/pdf');
//header('Content-Disposition: attachment; filename="downloaded.pdf"');
WaterMark::applyAndSpit('C:\xampp\htdocs\tst\test0.pdf','C:\xampp\htdocs\tst\output0.pdf');

当我加载一个超过 2 个页面的 pdf 时,所有页面都合并到一页中。我在这篇文章中附上了图片。 enter image description here

谢谢。

最佳答案

我发现该脚本有几个问题。要让它工作,请将 doWatermark() 方法更改为:-

public function doWaterMark()
{
$currentFile = $this->file;
$newFile = $this->newFile;

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

for($i = 1; $i <= $pagecount; $i++){
$this->pdf->addPage();//<- moved from outside loop
$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);//<-added
}

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

我将 $this->pdf->addPage(); 行移到了循环中,否则所有内容都会输出到一页上。我还添加了 $this->_rotate(0); 以在保存文件之前将其恢复原状。真的很简单。我已经为您评论了更改后的行。

我在 32 页的 pdf 上对其进行了测试,它似乎工作正常。

关于php - FPDI/FPDF : Watermark and Print Multiple Pages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10468478/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com