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: 94%



WP Oceny
12
7
0
-1
15
4
7
11


Komentarze: 10

  1. Ewa Kowalska mówi:

    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 mówi:

    Paczki z fontami nie ma we wskazanym miejscu… :(

  4. kiewball mówi:

    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 mówi:

    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 mówi:

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

Odpowiedz

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

jQuery: powiązane pola select

Jakiś czas temu napisałem jak można powiązać ze sobą dwa pola select, tak aby drugi generował się dynamicznie na podstawie [...]

jQuery: ruchomy skyscraper

Dzisiaj zaprezentuje w jaki sposób możesz na swojej stronie umieścić baner zwany także skyscraperem. Jest to baner o wymiarach 120×600 [...]

Ajax & jQuery: krótkie linki

W tym wpisie zaprezentuję w jaki sposób zrobić aplikację do generowania krótkich linków z wykorzystaniem Ajax’a i jQuery. Nasze krótkie [...]

Galeria z Lightbox’em

Często na swojej stronie chcemy mieć galerię, gdzie będziemy prezentować różnego rodzaju zdjęcia. Dobrze by było, aby galeria ta posiadała [...]

  Sponsorzy bloga
  Reklama na blogach - Brand New Media
Reklama na blogach - Blogvertising.pl
Silesia City Center on Facebook