2013-01-27 4 views
4

Это похоже на простейшую вещь, но я не могу заставить ее работать.TCPDF и FPDI с несколькими страницами

Мне нужно добавить текст на первую страницу многостраничного PDF в (может быть любым количеством страниц)

Используя этот код на две страниц в формате PDF (без цикла, используя только $ 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'); 

Ссылки на DOCS

TCPDF Классы Классы http://www.tcpdf.org/doc/code/classTCPDF.html#a5171e20b366b74523709d84c349c1ced

FPDI http://www.setasign.de/support/manuals/fpdi/

FPDF_TPL Классы http://www.setasign.de/support/manuals/fpdf-tpl/

ответ

10

решить мою проблему ...

// 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); 

И увидеть второй последний блок кода - для цикла добавляет остаток страниц.

Не знаете, так ли это должно быть сделано? Я читал в нескольких местах, что этого было даже невозможно достичь, также код не предоставляется в документах. Однако это работает, надеюсь, что это поможет кому-то.

+0

Благодарим вас за это. Это именно то, что мне нужно. – starshine531

+0

Вы могли бы просто поместить 'useTemplate' в этот' for' цикл вместо расширения класса, что, вероятно, сделало бы цикл for более интуитивным (т. Е. Получить данные ('importPage'), распечатать данные (' useTemplate')) , Но хороший вопрос/ответ, тем не менее, вдохновил меня решить мою собственную проблему! – Sygmoral

+0

Метод '$ pdf-> endPage()' больше не присутствует. – Rinos

0

, что код не будет работать, попробуйте следующее:

$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); 
} 
} 
+2

Хотелось бы знать, почему я был downvoted – rimba

1
$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 (правда, 10), не установить курсор на последней странице, так что вам нужно сделать это вручную с помощью функции $pdf->lastPage();

6

Я боролся с этим немного, и попытался придумать простой способ добавить текст к последнему страницы многостраничного документа. Вот очень простой код, который работал для меня:

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.

+0

Ошибка FPDF: Неправильный выход: 12 – 151291

+0

'$ pdf-> Выход ('F', $ path)' – senty