Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Problem z wygenerowaniem pdf-a.
Forum PHP.pl > Forum > Przedszkole
wojtek33
Witam wszystkich

Mam problem z wygenerowaniem pdf-a. Chodzi o to, że jeżeli w pliku który generuje pdf-a mam na samym końcu coś takiego: $pdf->Output('plik.pdf'); to wtedy powstaje mi ten plik i otwieram go i jest wszystko ok.
Natomiast jeżeli usunę z nawiasów 'plik.pdf' czyli mam: $pdf->Output(); to wtedy wyskakuje mi błąd i nie ma pliku. Błąd jest następujący:
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\wojtek\index.php:49) in C:\xampp\htdocs\wojtek\fpdf\fpdf.php on line 1022
FPDF error: Some data has already been output to browser, can't send PDF file.
Nie chcę aby tworzył mi plik.pdf, potrzebuję aby otwierał mi czyste okno z pdf-em.
W tej linijce 49 pliku index.php mam coś takiego:

47. <td class="menu" bgcolor=#F0F0F0 valign="top" width="20%">
48. <!-- menu -->
49. <?php include("menu.php");?>
50. </td>
51.
52. <td class="tresc" width="80%" height="500px" valign="top">
53. <!-- tresc glówna -->

Używam klasy fpdf.

Proszę o pomoc bo już sam nie wiem o co chodzi.
morbic
Yyy... ale o co kaman?

Widzę jeden, wielki bałagan.

Jak wygląda plik menu.php? Gdzie próbujesz wygenerować PDFa?


PS: Używaj tagów [php ]
wojtek33
Widzisz przecież, że pokazuje ci 49 linijkę kodu - tą o którą krzyczy !
morbic
Ale z tej linijki nie widzę menu.php.

Generalnie problem polega na tym, że próbujesz wygenerować PDF w miejscu, przed którym zostały wysłane już jakieś dane do przeglądarki (kod HTML?)

Cała procedura tworzenia PDFa powinna obejmować tylko i wyłącznie kod PHP, zero spacji/enterów przed/po znacznikach <?php ?> , zero HTMLa, zero czegokolwiek.
wojtek33
Ok, rozumiem to. Powiedz mi w takim razie jak dołączyć pliki zewnętrzne do tej strony index.php - bo ta moja strona jest zbudowana z kilkunastu plików dołączanych za pomocą include(); Co mam z tym teraz zrobić. To przez to, że dołączam pliki nie wygeneruję już pdf-a? Nie rozumiem.
morbic
Może krótki przykład na zasadzie porównania:

Prawidłowy plik .php generujący PDF:
  1. <?php
  2. require 'fpdf.php';
  3.  
  4. $pdf=new FPDF();
  5. $pdf->AddPage();
  6. $pdf->SetFont('Arial','B',16);
  7. $pdf->Cell(40,10,'Hello World!');
  8. $pdf->Output();
  9. ?>


Kod podobny do Twojego
Kod
<html><head></head>
<body>blablabla</body>
<?php
... FPDF tutaj ...
?>
</body>
</html>


Chodzi o to, że w pliku, gdzie generujesz PHP, nie może być nic poza tagami <?php i ?> , żadnego echo, printf() ani niczego, co wywalało by jakikolwiek tekst lub cokolwiek do przeglądarki. Powinno być tylko i wyłącznie czyste PHP. Możesz dołączać co zechcesz, robić co zechcesz, pod warunkiem, że ani jeden znak nie zostanie wysłany do przeglądarki (tak jak w moim przykładzie pierwszym). W drugim przykładzie oprócz kodu PHP poleciał też HTML - wtedy PDF nie wygeneruje się poprawnie. I stąd ten błąd.
wojtek33
To jest zawartość pliku pdf.php

Zerknij i zobacz, ze nic nie ma:

<?php
require('fpdf/fpdf.php');
$pdf = new FPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->AddFont('arial_ce','','arial_ce.php');
$pdf->SetFont('arial_ce', '', 14);
$pdf->Write(5, 'Top 10 najczęściej wybieranych książek');
$pdf->Ln();

$pdf->SetFontSize(10);
$pdf->Write(5, 'ˆ 2011');
$pdf->Ln();

$pdf->Ln(5);

$pdf->SetFont('arial_ce', '', 10);
$pdf->Cell(100 ,7, 'Tytuł', 1);
$pdf->Cell(40 ,7, 'Kategoria', 1);
$pdf->Cell(30 ,7, 'Data', 1);
$pdf->Cell(20 ,7, 'Ilość', 1);
$pdf->Ln();

$pdf->SetFont('arial_ce', '', 10);

$result=mysql_query("SELECT k.*, a1.autor_nazwisko nazw1, a1.autor_imie imie1,
a2.autor_nazwisko nazw2,a2.autor_imie imie2, a3.autor_nazwisko nazw3, a3.autor_imie imie3, kat.nazwa_kat,
w.nazwa_wyd, aw.data_wypoz, COUNT(*) AS ilosc FROM ksiazki k LEFT JOIN autorzy a1 ON (k.autor=a1.autor_id)
LEFT JOIN autorzy a2 ON (k.wspolautor1=a2.autor_id) LEFT JOIN autorzy a3 ON (k.wspolautor2=a3.autor_id)
LEFT JOIN kategorie kat ON (k.id_kat = kat.id_kat) LEFT JOIN wydawnictwo w ON (k.id_wyd = w.id_wyd)
LEFT JOIN arch_wypozyczenia aw ON (k.id=aw.id_ksiazki)
GROUP BY k.tytul ORDER BY aw.data_wypoz DESC LIMIT 10");

while ($row = mysql_fetch_array($result)) {

$pdf->Cell(100, 7, $row['tytul'], 1);
$pdf->Cell(40, 7, $row['nazwa_kat'], 1);
$pdf->Cell(30, 7, $row['data_wypoz'], 1);
$pdf->Cell(20, 7, $row['ilosc'], 1);
$pdf->Ln();
}
$pdf->Output(); //wywołanie funkcji bez parametru spowoduje otwarcie w przeglądarce tego pliku, wtedy linia niżej nie jest potrzebna.
?>
morbic
Jeżeli to pełny kod, to jedynym logicznym wytłumaczeniem jest, że przed <?php albo po ?> wkradła się jakaś spacja/enter/cokolwiek.

Zerknij tutaj: http://phpedia.pl/wiki/Cannot_add_header_i...rs_already_sent

I umieszczaj kod na forum w znacznikach [php ] [/php ] !
wojtek33
Nadal nie wiem co jest nie tak. Niech ktoś to rozwikła.
melkorm
Cytat
Niech ktoś to rozwikła.


To na giełdę ofert zapraszam.
wrotek
Trochę nie rozumiem, jak chcesz wcisnąć pdfa pomiędzy kod html? Twój skrypcik tworzący PDF, zmieniając nagłówki, wysyła go jako plik do pobrania, a nie fragment kodu html. Powinieneś zrobić link do pliku ze skryptem, który właśnie generuje pdf, efekt będzie taki, że gdy ktoś kliknie w link, otworzy mu się okienko z zapisem pliku pdf.
wojtek33
Ja właśnie mam link do skryptu z pdf-em. Najpierw generuje listę książek i kiedy już mam tabelke, to na dole pod nia mam link do skryptu pdf. Po kliknięciu w niego powinien utworzyć pdf w nowym oknie. Chodzi o to że gdy wysyłam output(); z parametrem to powstaje plik.pdf. jeżeli bez parametry to już jest problem. Może ktoś wie gdzie jest problem w moim skrypcie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.