TCPDF и FPDI с несколькими страницами
Это выглядит как самая простая вещь, но я не могу заставить ее работать.
Мне нужно добавить текст на первую страницу многостраничного PDF (может быть любое количество страниц)
Используя этот код на двухстраничном PDF (без цикла for, просто используя $pdf->importPage(2)), я получаю две страницы, но вторая страница повторяет первую. Текст написан только на первой странице, и это хорошо, но мне нужно, чтобы все страницы были включены в выходной pdf. Вот мой код
// Original file with multiple pages
$fullPathToFile = 'full/path/to/file.pdf';
class PDF extends FPDI {
var $_tplIdx;
function Header() {
global $fullPathToFile;
if (is_null($this->_tplIdx)) {
$this->setSourceFile($fullPathToFile);
$this->_tplIdx = $this->importPage(1);
}
$this->useTemplate($this->_tplIdx);
}
function Footer() {}
}
// initiate PDF
$pdf = new PDF();
$pdf->setFontSubsetting(true);
// add a page
$pdf->AddPage();
// The new content
$pdf->SetFont("helvetica", "B", 14);
$pdf->Text(10,10,'Some text here');
// How to get the number of pages of original pdf???
// $numPages = $pdf->getNumPages(???);
// Carry on adding all remaining pages starting from page 2
for($i=2;$i<=$numPages;$i++) {
// Add another page
$pdf->AddPage();
// Do I need to declare the source file here?
// $pdf->setSourceFile($fullPathToWD);
$pdf->importPage($i);
}
// Output the file as forced download
$pdf->Output('theNewFile.pdf', 'D');
Ссылки на документы
Классы TCPDF http://www.tcpdf.org/doc/code/classTCPDF.html
Классы FPDI http://www.setasign.de/support/manuals/fpdi/
Классы FPDF_TPL http://www.setasign.de/support/manuals/fpdf-tpl/
4 ответа
Решил мою проблему...
// Original file with multiple pages
$fullPathToFile = 'full/path/to/file.pdf';
class PDF extends FPDI {
var $_tplIdx;
function Header() {
global $fullPathToFile;
if (is_null($this->_tplIdx)) {
// THIS IS WHERE YOU GET THE NUMBER OF PAGES
$this->numPages = $this->setSourceFile($fullPathToFile);
$this->_tplIdx = $this->importPage(1);
}
$this->useTemplate($this->_tplIdx);
}
function Footer() {}
}
// initiate PDF
$pdf = new PDF();
$pdf->setFontSubsetting(true);
// add a page
$pdf->AddPage();
// The new content
$pdf->SetFont("helvetica", "B", 14);
$pdf->Text(10,10,'Some text here');
// THIS PUTS THE REMAINDER OF THE PAGES IN
if($pdf->numPages>1) {
for($i=2;$i<=$pdf->numPages;$i++) {
$pdf->endPage();
$pdf->_tplIdx = $pdf->importPage($i);
$pdf->AddPage();
}
}
// Output the file as forced download
$pdf->Output('theNewFile.pdf', 'D');
Вы получите количество страниц, добавив первую часть этой строки
$this->numPages = $this->setSourceFile($fullPathToFile);
И посмотрите второй последний блок кода - цикл for добавляет оставшиеся страницы.
Не знаете, так ли это? Я читал в нескольких местах, что даже достичь этого было невозможно, также код не указан в документации. Тем не менее, это работает, надеюсь, это поможет кому-то.
Я немного боролся с этим и попытался найти самый простой способ добавить текст на последнюю страницу многостраничного документа. Вот очень простой код, который работал для меня:
require_once('fpdf/fpdf.php');
require_once('fpdf/fpdi.php');
$pdf = new FPDI();
$fullPathToPDF = '/usr/local/common/my.pdf';
$pageCount = $pdf->setSourceFile($fullPathToPDF);
for ($i = 1; $i <= $pageCount; $i++) {
$pdf->importPage($i);
$pdf->AddPage();
$pdf->useTemplate($i);
}
$pdf->SetFont('Helvetica');
$pdf->SetXY(110, 225);
$pdf->Write(8, 'A complete document imported with FPDI');
$pdf->Output($fullPathToPDF);
Просто измените полный путь к файлу на место, где у вас есть многостраничный PDF.
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
...
$pdf->SetMargins(10, 10, 10);
$pdf->SetAutoPageBreak(true, 10);
foreach($array as $item)
{
$pdf->AddPage(); //add new page for new item
$txt = some_long_long_text;
$pdf->Write(0, $txt, '', 0, 'C', true);
$pdf->endPage(); //do end of page
$pdf->lastPage(); //set cursor at last page, because autopagebreak not do it
}
Например, у вас есть 10 учеников в массиве, и вам нужно создать резюме для каждого. На экзамене одно резюме имеет 3 страницы. Таким образом, вы получите PDF с 30 страницами, с правильным текстом.
SetAutoPageBreak(true, 10), не устанавливать курсор на последней странице, поэтому вам нужно сделать это вручную с помощью функции $pdf->lastPage();
Этот код не будет работать, попробуйте это:
$pdf = new PDI();
$pdf->AddPage();
$pdf->setSourceFile('zzz.pdf');
$pdf->numPages = $pdf->setSourceFile('zzz.pdf');
$tplIdx = $pdf->importPage(1);
$pdf->useTemplate($tplIdx, 10, 20, 200);
if($pdf->numPages>1) {
for($i=2;$i<=$pdf->numPages;$i++) {
$pdf->AddPage();
$tplIdx = $pdf->importPage($i);
$pdf->useTemplate($tplIdx, 10, 20, 200);
}
}