2012-03-01 12 views
10

C'è un modo per avere un logo di intestazione diverso per la prima pagina in un documento e diverso per la seconda pagina?TCPDF imposta intestazioni diverse per pagine diverse in un documento

ho pensato che cambiare i dati di intestazione tra le pagine aggiungendo potrebbe fare il trucco, ma nel mio test sembra che l'impostazione della intestazione dopo l'aggiunta della prima pagina non ha alcun effetto:

/* other stuff 
$pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
$pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); 
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); 
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER); 
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER); 

$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 
$pdf->AliasNbPages(); 
*/ 

$pdf->SetHeaderData("logo_1.png", PDF_HEADER_LOGO_WIDTH, '', ''); 
$pdf->AddPage(); 
$pdf->writeHTML($htmlContent, true, 0, true, true); 

$pdf->SetHeaderData("logo_2.png", PDF_HEADER_LOGO_WIDTH, '', ''); 
$pdf->AddPage(); 
$pdf->writeHTML($htmlContent2, true, 0, true, true); 

È possibile che questo produce un documento con 2 pagine, entrambe con logo_1.png nell'intestazione.

Sarà necessario personalizzare TCPDF stesso? Qualcuno ha fatto questo? Sto usando la versione 5.9.144.

risposta

7

Strano. Sto avendo lo stesso problema, ma questo ha funzionato nella mia versione precedente della versione TCPDF: 4.8.009 e ho notato il problema quando ho aggiornato a 5.9.149.

Ho confrontato il 2 e ho isolato il problema con la funzione Header().

Potrei forzarlo a permettermi di cambiare l'intestazione e accettarlo eseguendo questo: $ pdf-> setHeaderTemplateAutoreset (true);

+0

Eccellente, questo è esattamente quello che cercavo – bububaba

1

Che dire di ... avere TCPDF generare pagine con intestazioni diverse come documenti separati e quindi utilizzare qualcosa per unire tutti i PDF intermedi insieme per formare le pagine del documento finale (forse anche TCPDF stesso può unire, non so)?

Un paio di "come unire?" Risultati:

+0

Sto utilizzando Zend Framework per il progetto, quindi l'unione è facile con 'Zend_Pdf'. Pubblicherò il codice rilevante come risposta separata. Grazie per l'aiuto! – bububaba

+0

Ci scusiamo per aver portato via qualche reputazione, l'altra soluzione è esattamente quello che stavo cercando. – bububaba

0

Solo per la cronaca, se qualcuno ha lo stesso problema in futuro e può utilizzare Zend_Pdf:

// $filename is the final filename with path to save the generated PDF 
$dir = dirname($filename); 
$base = basename($filename); 

$page1 = $dir . DIRECTORY_SEPARATOR . "tmp_1_" . $base; 
$page2 = $dir . DIRECTORY_SEPARATOR . "tmp_2_" . $base; 

//creates 1st page with TCPDF and saves to filesystem with filename $page1 
$this->generateInvoicePage1($html_1, $page1); 

//creates 2nd page with TCPDF and saves to filesystem with filename $page2 
$this->generateInvoicePage2($html_2, $page2); 

$pdf1 = Zend_Pdf::load($page1); 
$pdf2 = Zend_Pdf::load($page2); 

foreach ($pdf2->pages as $page) { 
    $pdf1->pages[] = clone($page); 
} 

$pdf1->save($filename); 

unlink($page1); 
unlink($page2); 
+0

Inoltre, dal punto di vista delle prestazioni, sembra essere un po 'più lento di generare un documento con una libreria, quindi attenzione. – bububaba

6

Di seguito ha lavorato per me,

class MYPDF extends TCPDF{ 
    function header1(){ 
     //print whatever the header 1 is 
    } 
    function Header2(){   
     if($this->page==1){ 
      //print header 1 and whatever the header 2 is 
     }else{ 
      //print just header 2 
     } 
    } 
} 
-1

Se si desidera avere una copertina senza intestazione e piè di pagina e pagine interne con loro, c'è un modo più semplice per gestire la cosa. sufficiente disattivare la stampa intestazione e piè di via 'setPrintHeader' e 'setPrintFooter' come segue:

$pdf->setPrintHeader(false); 
$pdf->setPrintFooter(false); 

$pdf->AddPage(); 
$pdf->SetFont("freesans", "B", 20); 
$pdf->Cell(0,10,"COVER TEXT",1,1,'C'); 

$pdf->setPrintHeader(true); 
$pdf->setPrintFooter(true); 

$pdf->setHeaderFont(array("freesans", "", 9)); 
$pdf->SetHeaderData('', '', 'Document Title', 'Document Header Text'); 
$pdf->AddPage(); 
$pdf->SetFont("freesans", "B", 20); 
$pdf->Cell(0,10,"Internal text",1,1,'C'); 

$pdf->Output("HappyCover.pdf", "I"); 

Enjoy!

+0

La domanda è come aggiungere un logo diverso nell'intestazione, non eliminare l'intestazione nel suo insieme. –

+0

Hai ragione Tom, ho frainteso. Scusate. – WebOnLife

+0

La soluzione giusta è ciò che suggeriva Joaquin, sovrascrivendo i metodi Header() e Footer(). – WebOnLife

3

ho usato:

$pdf->resetHeaderTemplate(); 

Dovrebbe ignorare l'header del template e assegnare quello nuovo in base alle necessità. Ha funzionato per me.

0

ho trovato questo per essere la soluzione con il tocco più leggero:

class MYPDF extends TCPDF { 

    //Page header 
    public function AddNewHeader($newTitle) { 
     $this->header_xobj_autoreset = true; 
     $this->header_title = $newTitle; 
    } 

} 

assicurarsi di chiamare TCPDF :: setHeaderData() prima. Quindi, chiama questa funzione prima di ogni evento AddPage() oppure, se esegui il looping dei dati e ti affidi a tcpdf per aggiungere pagine, chiamalo dopo ogni elemento aggiunto.Rompe la memorizzazione nella cache dell'intestazione, ma consente all'utente di inserire un'intestazione nuova e personalizzata su ciascuna pagina. Tutti gli elementi restituiti da TCPDF :: getHeaderData() possono essere aggiornati in questo modo.

Problemi correlati