#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/downloads5. Пожалуйста, ознакомьтесь с предложенным способом в моем ответе. Спасибо
Ответ №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. Большое вам спасибо за объяснение ваших ответов с помощью примера кода и за то, что приложили все эти усилия. Я действительно ценю все, что вы сделали. Ты мне очень помогаешь.