FPDF: Czyli generujemy PDF za pomocą PHP

Autor: Arkadiusz Tobiasz 4 kwietnia 2009

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.

Popularity: 86%

Komentarze: 14

  1. Ewa Kowalska pisze:

    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..

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

  3. Robert pisze:

    Paczki z fontami nie ma we wskazanym miejscu… :(

  4. kiewball pisze:

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

  5. bald pisze:

    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.

    • 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.

      • nooga pisze:

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

        • 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);
  6. [...] czas temu obiecałem pokazać Wam skrypt, który na podstawie formularza generuje odpowiedniego PDFa. Od obietnicy [...]

  7. sound pisze:

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

Odpowiedz

 
Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...





Zend Framework: gwiazdka przy wymaganych polach

W przypadku wymaganych pól w formularzach najczęściej oznacza się je poprzez dodanie gwiazdki. W tym wpisie chciałbym pokazać w jaki [...]

MySQL: GROUP_CONCAT

Ostatnio zostałem poproszony, aby na liście zamówień w sklepie PrestaShop wyświetlić listę produktów, które zostały sprzedane. Oczywiście można by było [...]

Zend Framework: jak zwiększyć wartość o 1 w bazie danych?

Ostatnio wykonując projekt w Zend Framework musiałem zwiększyć wartość kolumny pewnego rekordu o jeden. Oczywiście można by było wykonać najpierw [...]

PHP: Skracanie długich linków

Czasem w komentarzach ktoś może wstawić długi link, który może rozciągnąć naszą stronę. Jednym z rozwiązań jest skrócenie linku. Przykładowo [...]