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');  
Moet je zelf naar een nieuwe pagina gaan of doet tcPDF dat automatisch?
Ger van Steenderen op 17/11/2011 17:16:21

Moet je zelf naar een nieuwe pagina gaan of doet tcPDF dat automatisch?


Ik moet zelf een nieuwe pagina aanmaken, het blijkt dat tcPDF dit zelf niet goed oplost als het om tabellen gaat.

En dat is nu mijn probleem, ik komt niet uit die $currY. Er zijn wat posts over te vinden op internet, echter lijkt het een bug maar schijnt het ook weer opgelost te zijn.

Het is in ieder geval slecht gedocumenteerd.
$currY lijkt mij de huidige y coordinaat op de pagina.
Maar misschien moet je die gewoon zelf bijhouden.


Ger van Steenderen op 18/11/2011 12:42:25

$currY lijkt mij de huidige y coordinaat op de pagina.
Maar misschien moet je die gewoon zelf bijhouden.






Dat klopt, echter is dat lastiger dan het lijkt.

Er zijn wel wat workarounds en functies... maar dat lost weinig op tot nu toe.

<?php
$pdf = new TCPDF();
$pdf -> SetAutoPageBreak(false);
for ($i=0;$i<count($data);$i++) {
	if($pdf->GetY() + 10 > 267){
		$pdf->endPage();
		$pdf->setPrintHeader(false);
		$pdf->setPrintFooter(false);
		$pdf->startPage();
		//hier evemntueel andere dingen
	}
	$pdf->Cell(50,10, 'Regel', 0, 1);
}
?>
?>
Ger van Steenderen op 18/11/2011 16:47:21

<?php
$pdf = new TCPDF();
$pdf -> SetAutoPageBreak(false);
for ($i=0;$i<count($data);$i++) {
	if($pdf->GetY() + 10 > 267){
		$pdf->endPage();
		$pdf->setPrintHeader(false);
		$pdf->setPrintFooter(false);
		$pdf->startPage();
		//hier evemntueel andere dingen
	}
	$pdf->Cell(50,10, 'Regel', 0, 1);
}
?>
?>




OK, maar dit is de beste workaround ? Ik kreeg namelijk wat problemen met addpage in een foreach, headers stonden op de verkeerde pagina's.

Hoe zou jij dit verwerken in het script zoals ik dat aangeef ?

Dank zover.
Matt Me op 28/11/2011 17:36:03

OK, maar dit is de beste workaround ? Ik kreeg namelijk wat problemen met addpage in een foreach, headers stonden op de verkeerde pagina's.

Hoe zou jij dit verwerken in het script zoals ik dat aangeef ?

Ik zelf zou een eigen class maken op basis van TCPDF en de functionaliteit aanpassen c.q uitbreiden.
Mijn voorbeeld zou moeten werken.
Ger van Steenderen op 29/11/2011 09:23:46

[quote="Matt Me op 28/11/2011 17:36:03"]
OK, maar dit is de beste workaround ? Ik kreeg namelijk wat problemen met addpage in een foreach, headers stonden op de verkeerde pagina's.

Hoe zou jij dit verwerken in het script zoals ik dat aangeef ?

Ik zelf zou een eigen class maken op basis van TCPDF en de functionaliteit aanpassen c.q uitbreiden.
Mijn voorbeeld zou moeten werken.
[/quote]


Maar de data output van de array zou jij dus doen op het stuk:

//hier evemntueel andere dingen

Wat ik namelijk niet duidelijk krijg met tcPDF is dat je ook functies zoals jij geeft gewoon aan het begin van de code kan gebruiken en dan wordt het opgepakt... beetje confusing zeg maar.

Ik hou hetzelfde probleem zie ik net, een grote rommel :(

Matt,
Om te beginnen zou ik de begincode al uit je script halen (ie class mypdf)
Je krijgt dan zoiets:
<?php
$pdf = new TCPDF;
$pdf->SetAutoPageBreak(false);
//hier zet je de header en footer voor  pag 1
$pdf->AddPage()
/* AddPage() voegt automatisch the header toe
   nu kan je de header wijzigen of hem uitschakelen
   uitschaklen = $pdf->setPrintHeader(false);
   ******************************************/
for ($i=0;$i<count($data);$i++) {
	if ($pdf-> GetY() + 10 > 277) {
		/*10 = de hoogte van je regel in millimeter
		/ 277 is y pos ten opzichte van de topmargin
		/ waar is een nieuwe pagina generen
		/ AddPage sluit automatisch de huidige pagina af
		/ zet er de footer gegevens in en begint een nieuwe
		****************************************************/
		$pdf->AddPage();
		//hier ook weer de footer opnieuw instellen of uitschakelen
	}
	//print de row
}
?>

PS. Ik kan niet alle functies goed hebben want ik ben nl op vakantie in be
Hee Ger,

Wat een service vanaf je vakantie locatie!

Ik ben blij dat je zegt dat die my pdf eruit mag. Ik had hier al wat mee zitten spelen voorheen en dat bleek wel een issue, wat je nu schetst is vele malen duidelijker.

Wat count jij qua data, puur die array, of meer of iets anders ?

Ik denk dat ik hier een heel eind mee kom, mocht je nog iets toe willen voegen, altijd welkom natuurlijk!

Fijne vakantie!

Dank je!

Reageren