TCPDF Some data has already been output to browser, can't send PDF file
Heeft hier iemand ervaring met tcpdf?
Ik zit met een beetje een onduidelijk probleem. Ik heb tcpdf normaal geinstalleerd. Vervolgens de template aangepast.
Lokaal werkt het helemaal perfect. Maar zodra ik het online zet, krjgt ik een error als:
Warning: Cannot modify header information - headers already sent by (output started at /home/vhosts/erikdw.nl/httpdocs/officeman/php/conn.php:38) in /home/vhosts/erikdw.nl/httpdocs/tcpdf/tcpdf.php on line 8091
TCPDF ERROR: Some data has already been output to browser, can't send PDF file
Nu heb ik al op google gezocht en vind dit probleem vaker, maar nog geen goede oplossing gevonden.
Heeft iemand hier ervaring mee?
Gewijzigd op 06/01/2011 13:57:17 door Jens V
Ik heb geen ervaring met tcpdf maar aan je foutmelding te zien heb je iets tussen je html staan dat er eigenlijk boven hoort te staan. Je hebt dus iets op een verkeerde plek staan in je template.
Kijk eens in conn.php op (of rond) regel 38.
Code (php)
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
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
<?php
include("conn.php");
require_once('../../tcpdf/config/lang/eng.php');
require_once('../../tcpdf/tcpdf.php');
$selectfactuur = mysql_query("SELECT * FROM klanten,factuur,factuurregel WHERE factuur.factuur_id=".$_GET['facid'] ." AND klanten.klant_id=factuur.factuur_klantid AND factuurregel.facregel_factuurid=". $_GET['facid'] ."") or die(mysql_error());
$row = mysql_fetch_array($selectfactuur) or die(mysql_error());
$klantnaam = $row['klant_naam'];
$klantadres = $row['klant_adres'];
$klantpostcode = $row['klant_postcode'];
$klantbedrijfsnaam = $row['klant_bedrijfsnaam'];
$factuurnummer = $row['factuur_id'];
$klantwoonplaats = $row['klant_woonplaats'];
class MYPDF extends TCPDF {
public function Header() {
$this->setJPEGQuality(90);
$this->Image('../images/logo.png', 0, 0, 100, 33, 'PNG', 'http://www.google.com');
}
public function Footer() {
$this->SetY(-15);
$this->SetFont(PDF_FONT_NAME_MAIN, 'I', 8);
$this->Cell(20, 10, 'officeman.com - Facturatie app', 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('Auto Lemmer');
$pdf->SetTitle('Test Factuur');
$pdf->SetSubject('factuur');
$pdf->SetKeywords('TCPDF, PDF, example, tutorial');
// add a page
$pdf->AddPage();
// create address box
$pdf->CreateTextBox($klantbedrijfsnaam, 0, 55, 80, 10, 10, 'B');
$pdf->CreateTextBox($klantnaam, 0, 60, 80, 10, 10);
$pdf->CreateTextBox($klantadres, 0, 65, 80, 10, 10);
$pdf->CreateTextBox($klantpostcode.",". $klantwoonplaats, 0, 70, 80, 10, 10);
// date, order ref
$pdf->CreateTextBox('Date: '.date('d-m-Y'), 0, 65, 0, 10, 10, '', 'R');
$pdf->CreateTextBox('Factuur nummer: '. $factuurnummer, 0, 70, 0, 10, 10, '', 'R');
// list headers
$pdf->CreateTextBox('Aantal', 0, 90, 20, 10, 10, 'B', 'C');
$pdf->CreateTextBox('Product/Service omschrijving', 20, 90, 90, 10, 10, 'B');
$pdf->CreateTextBox('Prijs', 110, 90, 30, 10, 10, 'B', 'R');
$pdf->CreateTextBox('Totaal', 140, 90, 30, 10, 10, 'B', 'R');
$pdf->Line(20, 99, 195, 99);
// some example data
while($row = mysql_fetch_array($selectfactuur)){
$orders[] = array('quant' => $row['facregel_aantal'], 'descr' => $row['facregel_omschrijving'], 'price' => $row['facregel_prijsexcl']);
}
$currY = 98;
$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
ob_clean();
$pdf->Output('test.pdf', 'D');
?>
include("conn.php");
require_once('../../tcpdf/config/lang/eng.php');
require_once('../../tcpdf/tcpdf.php');
$selectfactuur = mysql_query("SELECT * FROM klanten,factuur,factuurregel WHERE factuur.factuur_id=".$_GET['facid'] ." AND klanten.klant_id=factuur.factuur_klantid AND factuurregel.facregel_factuurid=". $_GET['facid'] ."") or die(mysql_error());
$row = mysql_fetch_array($selectfactuur) or die(mysql_error());
$klantnaam = $row['klant_naam'];
$klantadres = $row['klant_adres'];
$klantpostcode = $row['klant_postcode'];
$klantbedrijfsnaam = $row['klant_bedrijfsnaam'];
$factuurnummer = $row['factuur_id'];
$klantwoonplaats = $row['klant_woonplaats'];
class MYPDF extends TCPDF {
public function Header() {
$this->setJPEGQuality(90);
$this->Image('../images/logo.png', 0, 0, 100, 33, 'PNG', 'http://www.google.com');
}
public function Footer() {
$this->SetY(-15);
$this->SetFont(PDF_FONT_NAME_MAIN, 'I', 8);
$this->Cell(20, 10, 'officeman.com - Facturatie app', 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('Auto Lemmer');
$pdf->SetTitle('Test Factuur');
$pdf->SetSubject('factuur');
$pdf->SetKeywords('TCPDF, PDF, example, tutorial');
// add a page
$pdf->AddPage();
// create address box
$pdf->CreateTextBox($klantbedrijfsnaam, 0, 55, 80, 10, 10, 'B');
$pdf->CreateTextBox($klantnaam, 0, 60, 80, 10, 10);
$pdf->CreateTextBox($klantadres, 0, 65, 80, 10, 10);
$pdf->CreateTextBox($klantpostcode.",". $klantwoonplaats, 0, 70, 80, 10, 10);
// date, order ref
$pdf->CreateTextBox('Date: '.date('d-m-Y'), 0, 65, 0, 10, 10, '', 'R');
$pdf->CreateTextBox('Factuur nummer: '. $factuurnummer, 0, 70, 0, 10, 10, '', 'R');
// list headers
$pdf->CreateTextBox('Aantal', 0, 90, 20, 10, 10, 'B', 'C');
$pdf->CreateTextBox('Product/Service omschrijving', 20, 90, 90, 10, 10, 'B');
$pdf->CreateTextBox('Prijs', 110, 90, 30, 10, 10, 'B', 'R');
$pdf->CreateTextBox('Totaal', 140, 90, 30, 10, 10, 'B', 'R');
$pdf->Line(20, 99, 195, 99);
// some example data
while($row = mysql_fetch_array($selectfactuur)){
$orders[] = array('quant' => $row['facregel_aantal'], 'descr' => $row['facregel_omschrijving'], 'price' => $row['facregel_prijsexcl']);
}
$currY = 98;
$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
ob_clean();
$pdf->Output('test.pdf', 'D');
?>
Dit is de aangepaste conn.php.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
$dbname = "";
$user = "";
$pass = "";
$host = "";
$to = "@gmail.nl";
$subject = "";
$from = ">";
if (!mysql_select_db($dbname, mysql_connect($host, $user, $pass)))
{
if (!$_SESSION["dberror"])
{
}
exit();
}
?>
session_start();
$dbname = "";
$user = "";
$pass = "";
$host = "";
$to = "@gmail.nl";
$subject = "";
$from = ">";
if (!mysql_select_db($dbname, mysql_connect($host, $user, $pass)))
{
if (!$_SESSION["dberror"])
{
}
exit();
}
?>
Ik kan zelf niet de fout vinden. Normaal heb ik in de conn.php ook de foutmeldingen staan als output. Maar voor de zekerheid weggehaald.
Wat staat er precies op conn.php regel 38?
TCPDF ERROR: Some data has already been output to browser, can't send PDF file
Dit zegt dat je op regel 38 van conn.php als output hebt naar de browser (html, spaties, .. ..)
Dat mag niet omdat tcpdf je headers wil aanpassen. Dat is de reden dat er gevraagd wordt naar wat je op regel 38 van conn.php hebt staan.
Waar hier ob_clean(); gebruikt?
Regel 38 is het sluit teken van php ?>, ik had daar al eens naar gekeken en ook al vervangen. Maar er stond nog steeds een spatie achter:S. Weer paar uurtjes zoeken voor een spatie:s.
Bedankt!
Jij hebt de beste reden gevonden om in een include-bestand de php-sluittag achterwege te laten :)
Heb jij bij dit script toevallig voor elkaar gekregen dat je een nieuwe pagina krijgt, dus je currY aangepast wordt als je over pagina 1 heen gaat met je rows ?