搜索

首页  >  问答  >  正文

FPDF和FPDI水印在X-Y方向上以一定角度重复。

<p>使用setasign/FPDF和setasign/FPDI库,我需要在任何PDF文档上添加水印和自定义页脚叠加(每个页面都需要加水印)。原始的PDF文件存储在服务器上,并且该过程必须在文件请求时进行(因为它们包含请求的日期和时间)。<br /><br />我成功地添加了所需的页脚,包括请求的日期和时间,感谢以下代码。该代码还在页面上对角线上打印了水印的单个出现,但是我真的希望有另一种行为:以对角线方式重复字符串,就像在这个图像上所示(例如,我的字符串是动态生成的)。字符串是否从页面的"外部"开始或结束并不重要,只要它在多行上重复出现,并且这些行必须等距离排列。<br /><br />您有任何关于从哪里开始的线索吗?<br /><br />截至今天的工作代码:</p><p><br /></p> <pre class="brush:php;toolbar:false;"><?php use setasignFpdiFpdi; require_once('vendor/autoload.php'); class Watermarked_PDF extends Fpdi { function Footer() { $this->SetY(-10); $this->SetFont('Arial', false, 8); $this->SetTextColor(28, 28, 28); $this->Cell(0, 15, 'File requested on : ' . date('r'), 0, 0, 'C'); } } function addWatermark($x, $y, $watermarkText, $angle, $pdf) { $angle = $angle * M_PI / 180; $c = cos($angle); $s = sin($angle); $cx = $x * 1; $cy = (300 - $y) * 1; $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)); $pdf->Text($x, $y, $watermarkText); $pdf->_out('Q'); } $pdf = new Watermarked_PDF(); $file_Path = 'documents/'; $file_Name = '13825_2023-07-04'; $pages_count = $pdf->setSourceFile($file_Path . $file_Name . '.pdf'); for ($i = 1; $i <= $pages_count; $i++) { $pdf->AddPage(); $tplIdx = $pdf->importPage($i); $pdf->useTemplate($tplIdx, 0, 0); $pdf->SetFont('Arial', 'B', 15); $pdf->SetTextColor(175, 175, 175); $watermarkText = 'file #' . $file_Name . ' - propery of company'; addWatermark(120, 220, $watermarkText, 45, $pdf); $pdf->SetXY(25, 25); } $pdf->Output();</pre> <p><em>来自这里的水印代码:https://phppot.com/php/php-watermark-pdf/ 并进行了适应。<br /><br />用于测试的基本composer.json文件:<br /></em></p><p><br /></p> <pre class="brush:php;toolbar:false;">{ "require": { "setasign/fpdf": "1.8.*", "setasign/fpdi": "^2.3" } }</pre> <p>多谢了</p>
P粉198814372P粉198814372478 天前477

全部回复(1)我来回复

  • P粉731861241

    P粉7318612412023-08-07 17:57:25

    我实际上找到了一个解决办法,但是它相当丑陋:

    for ($i = 1; $i <= $pages_count; $i++) {
        $pdf->AddPage();
        $tplIdx = $pdf->importPage($i);
        $pdf->useTemplate($tplIdx, 0, 0);
        $pdf->SetFont('Arial', 'B', 15);
        $pdf->SetTextColor(175, 175, 175);
        $watermarkText = 'file #' . $file_Name . ' - propery of company';
        addWatermark(0, 0, $watermarkText, 45, $pdf);
        addWatermark(0, 50, $watermarkText, 45, $pdf);
        addWatermark(0, 100, $watermarkText, 45, $pdf);
        addWatermark(0, 150, $watermarkText, 45, $pdf);
        addWatermark(0, 200, $watermarkText, 45, $pdf);
        addWatermark(0, 250, $watermarkText, 45, $pdf);
        addWatermark(0, 300, $watermarkText, 45, $pdf);
        addWatermark(0, 350, $watermarkText, 45, $pdf);
        addWatermark(0, 400, $watermarkText, 45, $pdf);
        addWatermark(0, 450, $watermarkText, 45, $pdf);
        $pdf->SetXY(25, 25);
    }

    即使这个更新的循环并不是最优化的,它也能完成工作。我现在会按照这种方式继续工作,并根据我的需求进行调整。

    回复
    0
  • 取消回复