FPDF: Czyli generujemy PDF za pomocą PHP

Dzisiaj pokaże Wam w jaki sposób przy użyciu PHP można wygenerować plik PDF. Aby rozpocząć całą zabawę będziemy potrzebować Bibliotekę FPDF, którą możecie pobrać stąd. To jeszcze nie wszystko. Musimy pobrać także polską czcionkę, aby były wyświetlanie wszystkie znaki poprawnie. Pobierz stąd paczkę i rozpakuj ją do katalogu fpdf/font/. Następnie cały katalog biblioteki kopiujesz na serwer.

Możemy teraz rozpocząć pracę nad skryptem, który będzie generował plik PDF. Na początku wstawiamy:

1
2
3
4
5
6
<?php
require('fpdf/fpdf.php');

$pdf=new FPDF();
$pdf->Open();
$pdf->AddPage('L');

W taki sposób otrzymamy pustą stronę o ile na końcu skryptu dodamy $pdf->Output(); co generuje dokument PDF. Jak zauważyliście metoda AddPage(); ma parametr ‚L’, co oznacza, że orientacja dokumentu będzie pozioma. Jeśli chcesz standardową orientację pionową nie musisz podawać żadnego parametru. Teraz czas na wypełnienie naszego dokumentu tekstem, ale zanim to zrobimy musimy dodać polskie czcionki. Robimy to za pomocą metody AddFont(); co wygląda następująco:

1
2
3
4
$pdf->AddFont('arial_ce','','arial_ce.php');
$pdf->AddFont('arial_ce','I','arial_ce_i.php');
$pdf->AddFont('arial_ce','B','arial_ce_b.php');
$pdf->AddFont('arial_ce','BI','arial_ce_bi.php');

W metodzie tej podajemy trzy parametry: w pierwszym definiujemy nazwę czcionki, którą będziemy używać korzystając z metody SetFont();, drugi to styl czcionki (B – pogrubienie, I – kursywa itd.), a trzeci to odwołanie do czcionki w katalogu fpdf/font/. Mamy dodane już wszystkie kroje czcionki Arial, więc teraz ustawiamy czcionkę, z której będziemy korzystać przy dodawaniu tekstu za pomocą metody SetFont(); co nam daje:

1
$pdf -> SetFont('arial_ce', 'B', 16);

Krótko omówię tą metodę. Podajemy w niej trzy parametry: pierwszy to zdefiniowana wcześniej nazwa czcionki, drugi to styl czcionki, a trzeci to jej rozmiar. Jeśli zrobiliśmy wszystko co powyżej, to w końcu możemy dodać tekst, który będzie wyświetlany w naszym dokumencie:

1
$pdf->MultiCell(0,5, 'Tekst, który zostanie wygenerowany za pomocą Biblioteki FPDF. ',0, 'J',0);

W celu dodania tekstu, który ma być wyświetlony w naszym dokumencie wykorzystaliśmy metodę MultiCell();, która posiada kilka argumentów. Pierwszy do szerokość pola (jeśli ustawimy 0, to będzie to długość do prawego marginesu dokumentu), drugi to wysokość pola, trzeci to tekst, który ma być wyświetlony w polu. Reszta argumentów jest opcjonalna i jest to kolejno obramowanie pola (0 – brak obramowania, 1 – obramowanie), wyrównanie tekstu (C – wyśrodkowanie, J – justowanie, R – wyrównanie do prawej) oraz wypełnienie pola (0 – brak wypełnienie, 1 – wypełnienie wcześniej zdefiniowanym kolorem, w razie jego braku wypełnia komórkę na czarno). Metoda MultiCell(); jest rozbudowaną wersją metody Cell();, która potrafi zawijać wiersze jeśli natrafi na prawy margines bądź koniec komórki.

Mankamentem tej biblioteki jest to, że trzeba za każdym razem ustawiać kursor w miejscu, gdzie chcemy wstawić tekst. Jest to czasem męczące. Tutaj z pomocą przychodzą nam dwie metody GetX(); oraz GetY();, które zwracają nam wartości aktualnie ustawionych współrzędnych. Współrzędne możemy definiować za pomocą metod: SetXY(float x,y);, SetX(float x); i SetY(float y);, które ustawiają kursor w odpowiednim miejscu. Poniżej przedstawiam zastosowanie tych metod:

1
2
3
$x = $pdf->GetX();
$y = $pdf->GetY();
$pdf->SetXY($x, $y+10);

Efekt będzie taki, że nas kursor zostanie ustawiony dziesięć milimetrów pod ostatnio napisanym tekstem. Teraz pozostaje nam tylko wygenerować dokument i robimy to za pomocą metody Output(); co wygląda tak:

1
2
$pdf->Output();
?>

Oczywiście omówiona po krótce przeze mnie biblioteka FPDF ma jeszcze wiele innych metod, które pozwalają na np. wstawienie obrazka do dokumenty czy ustawienie koloru czcionki. Wszystkie metody znajdziesz na stronie dokumentacji tej biblioteki. Jeszcze jedno, może się zdarzyć, że kodowanie na Twojej stronie jest inne niż polska czcionka, którą dodałeś. Jednak z pomocą przychodzi nam funkcja iconv(); dostępna w PHP. Chcąc przekonwertować tekst z np. ISO-8859-2 na Windows-1250 należy użyć tej czcionki w taki sposób:

1
$tekst = iconv('iso-8859-2','windows-1250//TRANSLIT', $tekst);

W najbliższej przyszłości postaram się Wam pokazać bibliotekę FPDF w akcji. Zaprezentuję skrypt generowania zaproszeń w PDFie za pomocą odpowiedniego formularza.

Comments

Ewa Kowalska

Wszystko pięknie, tylko ja mam zainstalowanego krasnala i wrzuciłam czcionki do usr/apache/httpd/html/phpMyAdmin/libraries/fpdf/font/,ale chyba coś nie tak, bo mi nie chce wygenerować nawet pustego pdf’a?Pomocy..

Reply
Arkadiusz Tobiasz

Czemu wrzuciłaś czcionki do katalogu bibliotek phpMyAdmina?
Powinnaś je wrzucić do katalogu ze swoją stroną.

Reply
Robert

Paczki z fontami nie ma we wskazanym miejscu… 🙁

Reply
    Arkadiusz Tobiasz

    Link został już poprawiony.

    Reply
kiewball

Przepraszam, działa, zapędziłem się z postem – można go usunąć.
Dziękuję za opis, jest bardzo przejrzysty i zrozumiały.

Reply
bald

Witam. Mam problem z generowaniem PDF. Znaki występujące po dużym „N” zachodzą na „N”, np. w wyrazie BADANIA, „N” i „I” zlewają się ze sobą w wygenerowanym dokumencie.

Reply
    Arkadiusz Tobiasz

    Trudno mi powiedzieć, ja takich problemów nie miałem. Tutaj przykładowy pdf wygenerowany przy użyciu FPDF. Prosiłbym o wklejenie kodu skryptu na wklejto.pl lub inny podobny serwis.

    Reply
      nooga

      A można prosić kod generujący taki dokument?
      Chciałbym zobaczyć jak rozwiązałeś wstawianie grafik obok tekstu.

      Reply
        Arkadiusz Tobiasz

        Przykładowy kod, grafika o wymiarach 80×60 umieszczona 1 cm od górnej i lewej krawędzi, tekst umieszczony 10 cm od lewej krawędzi

        1
        2
        3
        4
        5
        6
        7
        $pdf -> AddPage();
                    $pdf->SetFont("arial_ce","B",18);
                    if(!empty($product_info['products_image_med'])) {
                    $pdf -> Image(tep_href_link(DIR_WS_IMAGES . $product_info['products_image_med']),10,10,'80','60','','http://www.slicznedywany.pl/online/product_info.php?products_id='.$product_info['products_id']);
                    }
                    $pdf -> SetXY(100,10);
                    $pdf -> MultiCell(100,10, iconv('iso-8859-2','windows-1250//TRANSLIT',$product_info['products_name']),0,"L",0);
        Reply
FPDF: generowanie zaproszeń | Arkadiusz Tobiasz

[…] czas temu obiecałem pokazać Wam skrypt, który na podstawie formularza generuje odpowiedniego PDFa. Od obietnicy […]

Reply
sound

Mam pytanie
Co należy zrobić by koleiny MultiCell nie schodził do nowej linijki tylko robił to w tej samej co poprzedni.

Reply
    Arkadiusz Tobiasz

    należy ustawić odpowiednie współrzędne za pomocą metody SetXY()

    Reply
      sound

      ok rozumiem, czyli tylko taka metoda..poprostu pytałm bo myślałem ze jest jakaś lepsza:) ze nie trzeba za każdym razem kombinować

      Reply
        Arkadiusz Tobiasz

        jeśli chcesz, aby były obok siebie to użyj metody Ceil() wtedy nie musisz ustawiać kursora.

        Reply

Leave a Comment

four × 4 =