【问题标题】:FPDI with Multiple Pages具有多页的 FPDI
【发布时间】:2014-11-11 23:14:26
【问题描述】:

我是 PHP 新手,在插入多个页面时使用 FPDI 有点困难。

我有一个包含 3 页的 .pdf 文件。 我最终将第 1 页保存为 3 页中的单独页面,并且可以与我的代码一起使用,但那是因为我的代码仅适用于 1 页。当我将它改回 3 页文件时,它给了我一个内部服务器错误。

这是我正在使用的代码:

<?php

require_once('prog/fpdf.php');
require_once('prog/fpdi.php');

// initiate FPDI
$pdf = new FPDI();

// add a page
$pdf->AddPage();

// set the source file
$pdf->setSourceFile("apps/Par.pdf");

// import page 1
$tplIdx = $pdf->importPage(1);

// use the imported page and place it at point 10,10 with a width of 100 mm
$pdf->useTemplate($tplIdx, null, null, 0, 0, true);

// font and color selection
$pdf->SetFont('Helvetica');
$pdf->SetTextColor(200, 0, 0);

// now write some text above the imported page
$pdf->SetXY(40, 83);
$pdf->Write(2, 'THIS IS JUST A TEST');


$pdf->Output();

我不确定如何将此代码转换为能够查看所有 3 个页面。 谁能帮帮我。

【问题讨论】:

    标签: php html pdf fpdf fpdi


    【解决方案1】:

    setSourceFile() 方法将返回您设置的文档的页数。 只需循环浏览这些页面并逐页导入它们。所有页面的示例如下所示:

    <?php
    require_once('prog/fpdf.php');
    require_once('prog/fpdi.php');
    
    // initiate FPDI
    $pdf = new FPDI();
    
    // set the source file
    $pageCount = $pdf->setSourceFile("apps/Par.pdf");
    
    for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
        $tplIdx = $pdf->importPage($pageNo);
    
        // add a page
        $pdf->AddPage();
        $pdf->useTemplate($tplIdx, null, null, 0, 0, true);
    
        // font and color selection
        $pdf->SetFont('Helvetica');
        $pdf->SetTextColor(200, 0, 0);
    
        // now write some text above the imported page
        $pdf->SetXY(40, 83);
        $pdf->Write(2, 'THIS IS JUST A TEST');
    }
    
    $pdf->Output();
    

    关于“内部服务器”,您应该启用错误报告:

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    

    ...或者只是检查您的 php 错误日志以获取详细信息。

    【讨论】:

    • 更新:在最新版本的 FPDI (2.2) 上,useTemplate() 的参数顺序发生了变化。使用:$pdf-&gt;useTemplate($tplIdx, 0, 0, null, null, true);
    • @Havenard:这不是顺序,而是here 中记录的默认值。 IIRC 在内部这根本没有改变吗?在 v2 中,您现在还可以传递一组选项,使其看起来像 $pdf-&gt;useTemplate($tplIdx, ['adjustPageSize' =&gt; true]);
    • 好吧,我发布这个是因为它确实有所作为,FPDI 会抛出一个致命错误,因为 xy 不能是 nullwidthheight 可以)。 -- 至少在 Composer 版本的库中,我注意到有变体并且没有测试它们。
    • @Havenard:你是对的!这是 BC 更改 - 这就是我们在迁移指南中记录它的原因。
    • 我有一个相关问题。我有一个 1-x 页的文档,有时我需要打印出 2 个文档副本,其中一些内容是静态的,而另一些是动态的。我有点知道该怎么做,但正在寻找一种方法将我的 PDF 文档的第二个副本附加到原始文档中。
    【解决方案2】:

    它对我有用:

    <?php
    
    require_once('fpdf/fpdf.php');
    require_once('fpdi/src/autoload.php');
    
    use \setasign\Fpdi\Fpdi;
    
    $pdf = new FPDI();
    // get the page count
    $pageCount = $pdf->setSourceFile('pdf_file.pdf');
    // iterate through all pages
    for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
        // import a page
        $templateId = $pdf->importPage($pageNo);
        // get the size of the imported page
        $size = $pdf->getTemplateSize($templateId);
    
        // create a page (landscape or portrait depending on the imported page size)
        if ($size[0] > $size[1]) {
            $pdf->AddPage('L', array($size[0], $size[1]));
        } else {
            $pdf->AddPage('P', array($size[0], $size[1]));
        }
    
        // use the imported page
        $pdf->useTemplate($templateId);
    
        $pdf->SetFont('Helvetica');
        $pdf->SetXY(5, 5);
        $pdf->Write(8, 'A complete document imported with FPDI');
    }
    
    $pdf->Output();
    

    改变数组($size['w'], $size['h']) 为数组($size[0], $size[1])

    【讨论】:

      【解决方案3】:
      <?php
      require_once('fpdf/fpdf.php');
      require_once('fpdi/fpdi.php');
      
      // initiate FPDI
      $pdf = new FPDI();
      
      // get the page count
      $pageCount = $pdf->setSourceFile('Laboratory-Report.pdf');
      // iterate through all pages
      for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
      // import a page
      $templateId = $pdf->importPage($pageNo);
      // get the size of the imported page
      $size = $pdf->getTemplateSize($templateId);
      
      // create a page (landscape or portrait depending on the imported page size)
      if ($size['w'] > $size['h']) {
          $pdf->AddPage('L', array($size['w'], $size['h']));
      } else {
          $pdf->AddPage('P', array($size['w'], $size['h']));
      }
      
      // use the imported page
      $pdf->useTemplate($templateId);
      
      $pdf->SetFont('Helvetica');
      $pdf->SetXY(5, 5);
      $pdf->Write(8, 'A complete document imported with FPDI');
      }
      
      // Output the new PDF
      $pdf->Output();    
      

      【讨论】:

        【解决方案4】:

        你可以通过旧的解决方案来做到这一点,但我在这里解释如何使用它。

        # Add 2 page
        $pdf->AddPage(); 
        $tplIdx2 = $pdf->importPage(2);
        $pdf->useTemplate($tplIdx2); 
        $pdf->SetAutoPageBreak(true, 5); # optional line
        

        这里你必须注意我正在添加 AddPage() 代码,将新页面添加到 PDF 中。添加页面始终是第一位的。这是必需的。

        importPage(Page_number) 将页面导入 PDF 的当前页面。

        【讨论】:

          【解决方案5】:

          这对我来说非常有效。 Laravel 实现。而且这只写在你想要的页面上,而不是每一页

          use setasign\Fpdf\Tpdf\Fpdf;
          use setasign\Fpdi\Fpdi;
          
          class SignDocumentsController extends Controller
          {
              public function signPDF(Request $data)
              {
                  
                  $pdf = new Fpdi();
                  
                  $pageCount = $pdf->setSourceFile($data["sourceFile"]);
                  
                  for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
                      $tplIdx = $pdf->importPage($pageNo);
                      $pdf->AddPage();
                      $pdf->useTemplate($tplIdx, 5, 5, 205);
          
                      $pdf->SetFont('Times');
                      $pdf->SetTextColor(0, 0, 0);
                      
                      if($pageNo==$data["pageNumber"]){
                          $pdf->Image($data["signitureImg"],$data["x"],$data["y"],$data["w"],$data["h"],$data["pictureType"]);
                          $x = $data["x"]+1;
                          $y = $data["y"]+$data["h"]+1;
                          $pdf->SetXY($x,$y);
                          $pdf->Write(0, date("Y-m-d H:i:s"));
                      }
                      $filename=$data["outputFile"];
                  }
                  $pdf->Output($filename,'F');
                  
                  return response()->json([
          
                      "success"=>true,
                      "responseBody" => [
                          "change_status" =>"Success"
                      ]
                              ], 201);
          
                  
          
              }
          
          }
          

          json post请求数据为:

          {
              "sourceFile":"/home/courage/Documents/TM 2020.pdf",
              "outputFile":"/home/courage/Documents/Signed.pdf",
              "pageNumber":"3",
              "signitureImg":"/home/courage/Downloads/signature.png",
              "x":"85",
              "y":"230",
              "w":"30",
              "h":"11",
              "pictureType":"png"
          }
          

          【讨论】:

            【解决方案6】:

            这是我的解决方案。这对我有用。

            $pdf = new Fpdi();
            
            $sourceFilePages = $pdf->setSourceFile($sourceFile);
            
                for($pageNo = 1; $pageNo <= $sourceFilePages; $pageNo++){
            
                    $template = $pdf->importPage($pageNo);
            
                    $pdf->AddPage();
                   
                    // $adjustPageSize needs to be set to true if you need to have the original PDF page dimensions 
                    $pdf->useTemplate($template, 0, 0, null, null, true);
            
            
                    if ($stampFirstPageOnly){
                        if ($pageNo == 1){
                            // stamping only the first page
                            $pdf->Image($stampFile, stampXCoord, $stampYCoords, $stampWidth, $stampHeight);
                        }
                    }
                    else{
                        // stamping all the pages
                        $pdf->Image($stampFile, $stampXCoord, $stampYCoords, $stampWidth, $stampHeight);
                    }
                }
            
            // pdfOutputMethod "I" -> Browser Inline, "D" -> Force Download, "F" -> Save to Disk
            $pdf->Output($pdfOutputMethod, $fileName);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-18
              相关资源
              最近更新 更多