Не удается отредактировать существующий PDF-файл с помощью FPDI

#php #pdf #fpdf #fpdi

Вопрос:

Я пытаюсь научиться редактировать PDF-файл с помощью FPDF и FPDI, используя язык PHP. У меня есть этот образец PDF-файла, в который я хочу вставить некоторые значения. Если бы я создал PDF-файл с помощью FPDF, все работало бы нормально. Но если я попытаюсь отредактировать существующий PDF-файл с помощью FPDI, он выдаст мне следующее сообщение об ошибке: 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 .zip из fpdf.org и извлек его на моем файловом сервере хостинга. Затем я скачал FPDI с setasign.com веб-сайт и загрузил этот zip-файл на мой веб-сервер hostinger online. Затем я извлек его из той же папки fpdf. (расширение zlib включено на моем сервере).

Комментарии:

1. Для вашего 2-го PHP (того, который, как вы говорите, не работает), пожалуйста, замените все $this->pdf-> на $pdf-> и повторите попытку

2. @KenLee Спасибо вам за ответ. После изменения я все равно получаю ту же ошибку. Если я удалю все коды и просто оставлю следующую строку инструкции require_once('../fpdf183/FPDI/FPDI-2.3.6/src/Fpdi.php'); в своем PHP-файле, я все равно получу ту же ошибку:

3. У вас есть другая версия fpdi ? (тот, что похож на этот : require_once('vendor/setasign/fpdi/fpdi.php');

4. @KenLee Нет, у меня нет другой версии и этого fpdi. В том, который я скачал, тоже нет папки с именем vendor/seatasign/.. . setasign.com/products/fpdi/downloads

5. Пожалуйста, ознакомьтесь с предложенным способом в моем ответе. Спасибо

Ответ №1:

A. Загрузка FPDI

После загрузки fpdi из say https://github.com/Setasign/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
 

после этого распакуйте и загрузите файлы в папку PHP вашего веб-сервера, затем используйте браузер для запуска testgen.php чтобы увидеть эффект. (php добавит текст Appendix 1(new) на каждую страницу исходного ok.pdf файла, а затем загрузит файл)

C. Проблема при обработке зашифрованного PDF-файла

И последнее, но не менее важное: пожалуйста, обратите внимание, что FPDI не поддерживает импорт зашифрованных PDF-документов см. следующую ссылку:

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

По моему опыту, для обработки зашифрованного pdf-файла вы можете использовать что-то вроде pdf995 для «печати» зашифрованного pdf-файла, чтобы создать обычный pdf-файл, затем этот последний pdf-файл может быть обработан FPDI.

Комментарии:

1. Я скачал файлы с упомянутого вами сайта github и извлек их в другую папку на моем хостинговом сервере. Когда я использую require_once 'FPDI-master/src/autoload.php'; его, он отлично работает. У меня даже может быть там тестовый файл, который выводит на экран «Привет, мир», так что путь правильный: require_once('FPDI-master/src/echohello.php'); . Однако всякий раз, когда он сталкивается с этой другой строкой: require_once('FPDI-master/src/fpdi.php'); он выдает то же самое сообщение об ошибке: Эта страница не работает, ….. Не могли бы вы, пожалуйста, сказать мне, откуда у вас эти vendor/autoload.php файлы?

2. Я пересмотрел свой ответ, добавив ссылку для загрузки zip-файла (содержащего как fpdf, так и fpdi). Пожалуйста, попробуйте

3. Спасибо, что проделали эту лишнюю милю. Я действительно ценю это. Ваш код и любой код, который я пишу, хорошо работают с этим ok.pdf файлом, который вы прикрепили. Здесь нет никаких проблем. Однако, если я попытаюсь использовать любой файл pdf, отличный от вашего ok.pdf файла, я получу ту же ошибку. Например, можете ли вы попробовать свой код с помощью этого PDF-файла с сайта adobe: adobe.com/support/products/enterprise/knowledgecenter/media/…

4. PDF — файл в вашей ссылке указывает на зашифрованный pdf-файл. (если вы проверите источник этого конкретного pdf-файла, вы увидите флаг /Encrypt) В документации fpdi указано, что она не поддерживает импорт зашифрованных pdf-файлов. Я только что пересмотрел свой ответ, чтобы указать на это. (и включил в свой ответ один из способов решения этой проблемы)

5. Большое вам спасибо за объяснение ваших ответов с помощью примера кода и за то, что приложили все эти усилия. Я действительно ценю все, что вы сделали. Ты мне очень помогаешь.