Ik ben bezig een pdf te genereren gebruikmakend van TcPDF. Nu is dat opzich niet zo vreselijk lastig alleen heb ik een array the splitten over meerdere pagina's in één tabel.

Doordat het een array_split is wil ik dus over iedere opvolgende pagina na de eerste pagina een andere header dan op pagina 1. Het lijkt niet mogelijk om via een if-statement een andere header aan te roepen, ik krijg onherroepelijk een van de twee pagina's te zien, de eerst of alles opvolgend op iedere pagina.

Ik heb het volgende script dat ik hiervoor gebruik. Het lijkt erop dat ik de $currY opnieuw moet berekenen maar dit is via de tcPDF documentatie niet echt uit te vinden.

Zijn er mensen die me hierbij kunnen helpen ? Ik heb al overwogen om over te stappen naar fpdf maar deze is erg outdated en tcPDF is niet voor niets een fork hiervan.

Ik wil ook niet van HTML naar PDF, maar echt een native PDF creeëren, dus vandaar dat tcPDF mij de beste optie lijkt, ook qua performance.

Het script:


require_once('tcpdf/config/lang/eng.php');
require_once('tcpdf/tcpdf.php');
 
class MYPDF extends TCPDF {
    public function Header() {
        $this->setJPEGQuality(90);
        $this->Image('logo.png', 120, 10, 75, 0, 'PNG', 'http://www.finalwebsites.com');
 
    }
    public function Footer() {
        $this->SetY(-15);
        $this->SetFont(PDF_FONT_NAME_MAIN, 'I', 8);
        $this->Cell(0, 10, 'finalwebsites.com - PHP Script Resource, PHP classes and code for web developer', 0, false, 'C');
    }
    public function CreateTextBox($textval, $x = 0, $y, $width = 0, $height = 10, $fontsize = 10, $fontstyle = '', $align = 'L') {
        $this->SetXY($x+20, $y); // 20 = margin left
        $this->SetFont(PDF_FONT_NAME_MAIN, $fontstyle, $fontsize);
        $this->Cell($width, $height, $textval, 0, false, $align);
    }
}

// create a PDF object
$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
 
// set document (meta) information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Olaf Lederer');
$pdf->SetTitle('TCPDF Example');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, tutorial');
 
// add a page
$pdf->AddPage();
 
// create address box
$pdf->CreateTextBox('Customer name Inc.', 0, 55, 80, 10, 10, 'B');
$pdf->CreateTextBox('Mr. Tom Cat', 0, 60, 80, 10, 10);
$pdf->CreateTextBox('Street address', 0, 65, 80, 10, 10);
$pdf->CreateTextBox('Zip, city name', 0, 70, 80, 10, 10);
 
// invoice title / number
$pdf->CreateTextBox('Invoice #201012345', 0, 90, 120, 20, 16);
 
// date, order ref
$pdf->CreateTextBox('Date: '.date('Y-m-d'), 0, 100, 0, 10, 10, '', 'R');
$pdf->CreateTextBox('Order ref.: #6765765', 0, 105, 0, 10, 10, '', 'R');

// list headers
$pdf->CreateTextBox('Quantity', 0, 120, 20, 10, 10, 'B', 'C');
$pdf->CreateTextBox('Product or service', 20, 120, 90, 10, 10, 'B');
$pdf->CreateTextBox('Price', 110, 120, 30, 10, 10, 'B', 'R');
$pdf->CreateTextBox('Amount', 140, 120, 30, 10, 10, 'B', 'R');
 
$pdf->Line(20, 129, 195, 129);
 
// some example data
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
 
$currY = 128;
$total = 0;
foreach ($orders as $row) {
    $pdf->CreateTextBox($row['quant'], 0, $currY, 20, 10, 10, '', 'C');
    $pdf->CreateTextBox($row['descr'], 20, $currY, 90, 10, 10, '');
    $pdf->CreateTextBox('$'.$row['price'], 110, $currY, 30, 10, 10, '', 'R');
    $amount = $row['quant']*$row['price'];
    $pdf->CreateTextBox('$'.$amount, 140, $currY, 30, 10, 10, '', 'R');
    $currY = $currY+5;
    $total = $total+$amount;
}
$pdf->Line(20, $currY+4, 195, $currY+4);

// output the total row
$pdf->CreateTextBox('Total', 20, $currY+5, 135, 10, 10, 'B', 'R');
$pdf->CreateTextBox('$'.number_format($total, 2, '.', ''), 140, $currY+5, 30, 10, 10, 'B', 'R');
 
// some payment instructions or information
$pdf->setXY(20, $currY+30);
$pdf->SetFont(PDF_FONT_NAME_MAIN, '', 10);
$pdf->MultiCell(175, 10, '<em>Lorem ipsum dolor sit amet, consectetur adipiscing elit</em>. <br />
Vestibulum sagittis venenatis urna, in pellentesque ipsum pulvinar eu. In nec <a href="http://www.google.com/">nulla libero</a>, eu sagittis diam. Aenean egestas pharetra urna, et tristique metus egestas nec. Aliquam erat volutpat. Fusce pretium dapibus tellus.', 0, 'L', 0, 1, '', '', true, null, true);
 
//Close and output PDF document
$pdf->Output('test.pdf', 'F');  
Ger,

Ik ben er mee aan de slag gegaan en heb ook gegoogled op de count welke jij toepast.

Ik krijg het niet voor elkaar.

Of ik krijg een lange rij met output op één PDF, of ik krijg één lange output op pagina 1 waarbij voor iedere regel nog een lege pagina wordt aangemaakt.

Ik zie dat meer mensen dit probleem hebben maar niet goed opgelost krijgen. Jouw voorbeeld zie ik in dergelijke vorm ook vaak langs komen maar zonder directe werkende oplossing.

Zou jij nog een hint/voorbeeld willen geven ?

Ik vermoed dat je de binnen de if ($pdf->GetY() + 10 > 287) de data displayed
Dat moet er buiten (op de plaats van //print de row). Ik heb net even getest en het werkt gewoon zoals het hoort.
Ger van Steenderen op 01/12/2011 11:33:10

Ik vermoed dat je de binnen de if ($pdf->GetY() + 10 > 287) de data displayed
Dat moet er buiten (op de plaats van //print de row). Ik heb net even getest en het werkt gewoon zoals het hoort.


Dat is gek, want ik print daar inderdaad de data, op //print de row. Wellicht omdat ik daar de hele loop weer doe.. ?

Jij pakt voor $data gewoon de $orders ?

Ik doe iets verkeerd, dat zeker.

Laat eens een stukje van je code zien
Dit is code waarmee ik getest heb:

<?php
require_once('tcpdf/tcpdf.php');
$pdf = new TCPDF();
$pdf->SetAutoPageBreak(false);
$pdf->SetFontSize(10);
$pdf->AddPage();
for ($i=0; $i<50; $i++) {
	if ($pdf-> GetY() > 280) $pdf->AddPage();
	$pdf->Cell(70, 8, 'Test', 1, 0);
	$pdf->Cell(70, 8, 'Test', 1, 1);
}
$pdf->Output('test.pdf', 'f');
?>

Hiermee krijg ik een nette output over 2 paginas
Ik heb het opgelost. Je voorbeeld deed 't hem, ik moet die bovenste zut gewoon vergeten :)

Ik hoop dat je nog een fijne vakantie hebt! Ik dank je erg!

De 'vakantie' is al weer voorbij :(
Geen dank, en ik moet jou ook bedanken, want ik was al bijna begonnen met het porten naar PHP van mijn eigen PDF generator die ik in een andere programmeertaal gemaakt heb.
Ger van Steenderen op 01/12/2011 18:01:00

De 'vakantie' is al weer voorbij :(
Geen dank, en ik moet jou ook bedanken, want ik was al bijna begonnen met het porten naar PHP van mijn eigen PDF generator die ik in een andere programmeertaal gemaakt heb.


Je zag tcpdf ook niet meer zo zitten ?
Matt Me op 01/12/2011 19:28:02

Je zag tcpdf ook niet meer zo zitten ?

Ik moet je eerlijk zeggen dat ik het pas ken sinds jij dit topic opgestart hebt.
Omdat ik zelf binnenkort ook voor een project in php pdf moet kunnen generen ik eens naar tcpdf gekeken (altijd beter om niet het wiel opnieuw uit te vinden).

Reageren