【问题标题】:Can't edit a existing PDF file with FPDI无法使用 FPDI 编辑现有 PDF 文件
【发布时间】:2021-06-19 16:37:47
【问题描述】:

我正在尝试学习如何使用 PHP 语言使用 FPDF 和 FPDI 编辑 PDF 文件。我有这个sample PDF file,我想在其中插入一些值。如果我要使用 FPDF 创建 PDF 文件,一切正常。但是如果我尝试使用 FPDI 编辑现有的 PDF 文件,它会给我以下错误消息:This page isn’t working. Failed to load resource: the server responded with a status of 500 ( ). crbug/1173575, non-JS module files deprecated. 下面显示了两个用于编辑 PDF 文件的程序。第一个有效,第二个失败。

<?PHP
  //This program works and create a new PDF file.
  require('fpdf.php');
  $pdf = new FPDF();
  $pdf->AddPage();
  $pdf->SetFont('Arial','B',16);
  $pdf->Cell(40,10,'Hello World!');
  $pdf->Output();
?>

以下用于编辑现有 PDF 文件的程序失败:

<?PHP
      require_once('fpdf.php'); 

      //This second line of code fails.
      require_once('../fpdf183/FPDI/FPDI-2.3.6/src/Fpdi.php'); //This path is correct. I have tested it out with a simple echo “hello world”; file. 
      //I assume I didn’t install fpdi correctly. I have tried replacing /Fpdi.php part with autoload.php as well. 


      $pdf = new FPDI();
      $pdf->AddPage(); 
    
      $pdf->setSourceFile('testfile.pdf'); 
      $tplIdx = $this->pdf->importPage(1); // import page 1 
      $this->pdf->useTemplate($tplIdx, 0, 0, 0, 0, true); 
      $this->pdf->SetFont('Arial', '', '13'); 
      $this->pdf->SetTextColor(0,0,0);
      $this->pdf->SetXY(20, 20); //set position in pdf document    
      $this->pdf->Write(0, 'Some texts will go in here');    
      $this->pdf->Output('newfile.pdf', 'D');//force the browser to download the output
    ?>

首先,我从fpdf.org 下载了 FPDF .zip 文件并将其解压缩到我的托管文件服务器中。然后我从setasign.com 网站下载了 FPDI,并将这个 .zip 文件上传到我的托管商在线网络服务器。然后我将它提取到同一个 fpdf 文件夹中。 (我的服务器中启用了 zlib 扩展)。

【问题讨论】:

  • 对于您的第二个 PHP(您说它失败的那个),请替换所有 $this-&gt;pdf-&gt;by $pdf-&gt; 并重试
  • @KenLee 谢谢你的回复。更改后,我仍然收到相同的错误。如果我删除所有代码并在我的 PHP 文件中保留以下语句 require_once('../fpdf183/FPDI/FPDI-2.3.6/src/Fpdi.php');,我仍然会收到相同的错误:
  • 你有其他版本的 fpdi 吗? (像这样的:require_once('vendor/setasign/fpdi/fpdi.php');
  • @KenLee 不,我没有另一个版本和这个 fpdi。我下载的那个也没有名为vendor/seatasign/.. 的文件夹。 setasign.com/products/fpdi/downloads
  • 请在我的回答中查看建议的方式。谢谢

标签: php pdf fpdf fpdi


【解决方案1】:

A. FPDI 下载

https://github.com/Setasign/FPDI 下载 fpdi 后,请使用以下命令启动 fpdi:

require_once 'FPDI-master/src/autoload.php';
require_once('FPDI-master/src/fpdi.php');


以下是我过去使用过的完整示例供您参考(我使用过 TCPDF,但已更改为使用 fpdf):

B.测试 PHP:testgen.php


<?php

require_once 'vendor/autoload.php';
//require_once('tcpdf/tcpdf.php');

require_once('fpdf/fpdf.php');

require_once('vendor/setasign/fpdi/fpdi.php');


$pdf = new FPDI();


$pagecount = $pdf->setSourceFile('ok.pdf');

for ($n = 1; $n <= $pagecount; $n++) {
$pdf->AddPage();


$tplIdx = $pdf->importPage($n);
$pdf->useTemplate($tplIdx);

$pdf->SetFont('Helvetica', 'B', 10);

$pdf->SetXY(150, 10);
$pdf->Write(0, "Appendix 1(new)");
}

$pdf->Output("output_sample_ken.pdf", "D");

?>

为了方便您进一步测试,您可以从此链接下载 fpdf / fpdi 文件:

http://www.createchhk.com/SO/pdfpack_20June2021.zip

之后,解压并上传文件到你的webserver PHP文件夹,然后用浏览器运行testgen.php看看效果。 (php会在原ok.pdf文件的每一页添加文字Appendix 1(new),然后下载文件)

C.处理加密 PDF 时出现问题

最后但同样重要的是,请注意FPDI 不支持导入加密的 PDF 文档请参阅以下链接:

https://www.setasign.com/support/faq/fpdi/can-fpdi-import-encrypted-pdf-documents/

根据我的经验,要处理加密的pdf,您可以使用pdf995之类的东西来“打印”加密的pdf以生成普通的pdf,然后FPDI可以处理后一个pdf。

【讨论】:

  • 我已经从您提到的 github 站点下载了文件,并将它们解压缩到我的托管服务器中的不同文件夹中。当我使用require_once 'FPDI-master/src/autoload.php'; 时,它工作正常。我什至可以在其中有一个向屏幕输出“Hello World”的测试文件,因此路径是正确的:require_once('FPDI-master/src/echohello.php');。但是,每当遇到另一行:require_once('FPDI-master/src/fpdi.php'); 时,它都会给出相同的错误消息:此页面不起作用,.....你能告诉我你从哪里得到这些 vendor/autoload.php 文件吗?
  • 我已经通过添加 zip 文件的下载链接(包含 fpdf 和 fpdi)来修改我的答案。请尝试
  • 感谢您的付出。对此,我真的非常感激。您的代码和我编写的任何代码都适用于您附加的 ok.pdf 文件。没有问题。但是,如果我尝试使用您的 ok.pdf 文件以外的任何 pdf 文件,我会收到同样的错误。例如,您可以使用来自 adobe 网站的 pdf 文件尝试您的代码:adobe.com/support/products/enterprise/knowledgecenter/media/…
  • 链接中的 pdf 指向加密的 pdf。 (如果您检查此特定 pdf 的来源,您将看到 /Encryp 标志) fpdi 文档已声明它不支持导入加密的 pdf。我刚刚修改了我的答案以指出这一点。 (并在我的回答中包含了解决此问题的方法之一)
  • 非常感谢您用示例代码解释您的答案并付出所有这些努力。我真的很感激你所做的一切。你帮了大忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多