Tabel in PDF over meerdere pagina's met tcPDF

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Matt Me

Matt Me

17/11/2011 16:04:59
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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');  
 
PHP hulp

PHP hulp

22/12/2024 10:10:07
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/11/2011 17:16:21
Quote Anchor link
Moet je zelf naar een nieuwe pagina gaan of doet tcPDF dat automatisch?
 
Matt Me

Matt Me

17/11/2011 21:09:08
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/11/2011 12:42:25
Quote Anchor link
$currY lijkt mij de huidige y coordinaat op de pagina.
Maar misschien moet je die gewoon zelf bijhouden.
 
Matt Me

Matt Me

18/11/2011 14:02:07
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/11/2011 16:47:21
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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);
}

?>

?>
 
Matt Me

Matt Me

28/11/2011 17:36:03
Quote Anchor link
Ger van Steenderen op 18/11/2011 16:47:21:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/11/2011 09:23:46
Quote Anchor link
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.
 
Matt Me

Matt Me

29/11/2011 10:45:38
Quote Anchor link
Ger van Steenderen op 29/11/2011 09:23:46:
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.



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 :(
Gewijzigd op 29/11/2011 11:55:24 door Matt Me
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/11/2011 19:07:08
Quote Anchor link
Matt,
Om te beginnen zou ik de begincode al uit je script halen (ie class mypdf)
Je krijgt dan zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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
 
Matt Me

Matt Me

29/11/2011 21:31:15
Quote Anchor link
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!
 
Matt Me

Matt Me

01/12/2011 09:41:56
Quote Anchor link
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 ?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

01/12/2011 11:33:10
Quote Anchor link
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.
 
Matt Me

Matt Me

01/12/2011 13:15:30
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

01/12/2011 13:31:07
Quote Anchor link
Laat eens een stukje van je code zien
Dit is code waarmee ik getest heb:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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
Gewijzigd op 01/12/2011 13:31:40 door Ger van Steenderen
 
Matt Me

Matt Me

01/12/2011 16:59:10
Quote Anchor link
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!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

01/12/2011 18:01:00
Quote Anchor link
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.
 
Matt Me

Matt Me

01/12/2011 19:28:02
Quote Anchor link
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 ?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

01/12/2011 20:22:25
Quote Anchor link
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).
Gewijzigd op 01/12/2011 20:39:28 door Ger van Steenderen
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.