7 października 2020

Generowanie plików PDF w PHP

Kategoria: Programowanie
Tagi: dla profesjonalistów, php
Autor: Paweł Mansfeld

PDF (ang. Portable Document Format) to opracowany i promowany przez firmę Adobe format plików, w których zapisujemy dokumenty. Format w założeniu ma umożliwiać wymianę dokumentów w taki sposób aby wyświetlał się identycznie niezależnie od systemu, oprogramowania czy urządzenia osoby, która wyświetla dokument.

Pliki formatów biurowych, takie jak doc czy odt nie gwarantują identycznego wyglądu dokumentu. Do znacznych różnic w wyglądzie może dojść w sytuacji kiedy na dwóch urządzeniach mamy zainstalowane różne fonty (czcionki) systemowe.

Choć PDF nie wpisuje się idealnie w czasy urządzeń mobilnych (dokumenty tego typu dość ciężko się przegląda na małych ekranach i nie są skalowalne jak responsywne strony internetowe) jest to ciągle standard w przypadku wymiany dokumentów w biznesie (np. Faktury VAT, oferty, umowy, wnioski) czy w branży poligraficznej. Format PDF jest też używamy w przypadku elektronicznego kupowania biletów na eventy czy generowania certyfikatów za ukończenie kursu online.

W tym przewodniku zajmiemy się automatycznym generowaniem dokumentów PDF przez aplikacje internetowe napisane w języku PHP. To właśnie w ten sposób aplikacje internetowe i sklepy generują wspomniane Faktury VAT, oferty czy bilety na eventy z unikalnym kodem paskowym.

Co to jest i jak działa PDF?

PDF bazuje na języku PostScript. Sposób w jaki zapisywana jest treść bardzo przypomina mechanizm działania znaczników HTML. To co jest charakterystyczne dla PDF to, że treść zapisana jest na płaskiej „kartce” o stałym wymiarze.

PDF może zawierać tekst, grafikę wektorową oraz grafikę rastrową. Może też zawierać elementy interaktywne np. adnotacje oraz formularze, które można potem na przykład wypełnić i wydrukować. Zapis treści w postaci wektorowej gwarantuje idealnie ostrą, szczegółową i wysoką jakość wizualną. Zapisanie grafiki wektorowej do PDF gwarantuje możliwość wygenerowania dowolnie dużej grafiki rastrowej bez jakiejkolwiek utraty danych. To dlatego grafik wysyła logo czy broszury w tym formacie. Jeżeli PDF nie zawiera grafiki rastrowej to jakość jego ostatecznego wydruku ograniczona jest jedynie przez wielkość wydruku oraz możliwości urządzenia drukującego.

Domyślnie, zapisanych plików PDF nie da się edytować. Choć istnieje możliwość manipulowania treścią w specjalnych programach, przyjęło się, że dokument PDF jest pewnego rodzaju „oryginałem”. Pliki PDF są też bardziej integralne niż formaty pakietów biurowych, co oznacza, że wprowadzenie do nich własnych modyfikacji wiąże się z większym wysiłkiem.

Wszystkie te cechy powodują, że od lat służy jako format do zapisu, przesyłania i publikowania:

  • dokumentów biurowych,
  • umów,
  • materiałów do druku,
  • książek, ebooków i innych publikacji,
  • instrukcji obsługi,
  • szablonów, planów, map,
  • grafiki wektorowej,
  • biletów,
  • certyfikatów.

Format PDF jest już otwarty, nieobciążony żadnymi patentami. Standard formatu PDF określa ISO 32000-1:2008 oraz ISO 32000-2:2017.

Tworzenie i eksport danych do pliku PDF w aplikacji PHP

Generowanie dokumentów przez aplikacje internetowe jest zjawiskiem z jakim spotykamy się na co dzień. Praktycznie każdy system CRM czy większa aplikacja SaaS w którymś z miejsc generuje pliki PDF. Nie będzie zaskoczeniem, że użyjemy gotowej biblioteki. Jedną z najpopularniejszych i najłatwiejszych w użyciu bibliotek do tworzenia dokumentów PDF w PHP jest mPDF autor: Ian Back.

Narzędzie mPDF generuje plik PDF po stronie serwera. Pozwala pobrać użytkownikowi stworzony dynamicznie dokument, lub zapisać efekt końcowy na dysku aby mógł być pobrany w dowolnym momencie. Biblioteka ma wiele możliwości ale zajmijmy się na początku prostymi przykładami.

Instalacja mPDF w PHP

Aby szybko móc wykorzystać mPDF we własnej aplikacji PHP najprościej jest włączyć konsolę SSH i jeżeli jeszcze nie mamy, instalujemy sobie Composera:

curl -sS https://getcomposer.org/installer | php

Dzięki kolejnej komendzie instalujemy najnowszą wersję mPDF dla PHP:

php -d memory_limit=-1 composer.phar require mpdf/mpdf

lub po prostu:

$ composer require mpdf/mpdf

Jest też oczywiście alternatywna/ręczna metoda instalacji za pomocą paczki zip dostępnej na stronie https://github.com/mpdf/mpdf/tree/master ale nie jest to zalecana metoda w dokumentacji. Trzeba wtedy pilnować aby załadować wymagane pliki i może to niepotrzebnie utrudnić aktualizowanie.

Przykład wykorzystania mPDF

Na początku ładujemy zależności i możemy przystąpić do generowania pierwszego PDFa. Na początek warto zrobić „Hello World”;

require_once '../../../vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('<h1>Testowy PDF</h1>');
$mpdf->Output();

Używamy metody WriteHTML, w której możemy się posługiwać dobrze nam znanym HTMLem. Efektem końcowym takiego kodu powinno być wyświetlenie się takiego PDF:

Pierwszy przykład wykorzystania mPDF

Generowanie treści PDF w ramach mPDF może się odbywać za pomocą komend PHP lub języka HTML. Obsługiwane są praktycznie wszystkie popularne tagi.

PDF tworzony za pomocą HTML obsługuje także style CSS. Działa to zarówno kiedy dodajemy osobny tag <style> jak i atrybutu style w znacznikach HTML.

Przydatnym trikiem jest jeszcze możliwość stworzenia nowej strony. Wymuszamy to poprzez tag <pagebreak/>.

Generowanie i eksport tabeli do pliku PDF

Niech podsumowaniem tych informacji będzie jeszcze jeden przykład:

$mpdf->WriteHTML('
<style>
   td, th{
      border:1px solid #555;
   }
   th{
      background:#eee;
   }
   table{
      width:100%;
   }
   tr,td,th{
      margin:0;
      padding:16px;
   }
</style>
<h1>Testowy PDF</h1>
<img src="https://obrazek1.jpg">
<pagebreak/>
<p>Test</p>
<pagebreak/>
<table id="table_id" class="display">
   <thead>
   <tr>
      <th>Kolumna 1</th>
      <th>Kolumna 2</th>
   </tr>
   </thead>
   <tbody>
      <tr>
         <td>Wiersz 1 Komórka 1</td>
         <td>Wiersz 1 Komórka 2</td>
      </tr>
      <tr>
         <td>Wiersz 2 Komórka 1</td>
         <td>Wiersz 2 Komórka 2</td>
      </tr>
   </tbody>
</table>
<pagebreak/>
<p>Test</p>
');

Jak widać wszystko działa. Dane są ułożone w formie tabeli, która rozpoczyna nową stronę i zostały uwzględnione style CSS zadeklarowane na początku kodu.

Generowanie ostylowanej tabeli mPDF

Aby zapisać taki plik na dysku wystarczy dodać argumenty do metody Output:

$mpdf->Output('plik.pdf','F'); 

Alternatywne biblioteki do tworzenia PDF w PHP

Oczywiście mPDF to nie jedyna biblioteka tego typu. W sieci można znaleźć wiele tutoriali i wzmianek na temat następujących bibliotek służących dokładnie do tego samego:

  • TCPDF,
  • DOMPDF,
  • FPDF,

Nieco mniej popularne lub od dawna nie aktualizowane:

  • html2ps
  • PDFlib,
  • Zend_PDF
  • Snappy (PHP 5),

Należy też pamiętać, że PHP ma własne natywne rozszerzenie PDF: https://www.php.net/manual/en/book.pdf.php. Nie jest ono jednak rozwijane od wielu lat.

Dodatek 1: Wydruk strony internetowej w przeglądarce

Całkiem innym podejściem umożliwienia wydruku strony internetowej bez udziału serwera jest użycie funkcji wydruku jaka jest dostępna w przeglądarkach. Przeglądarki umożliwiają wydrukowanie strony dokładnie tak jak ją widzą – możemy dokonać wydruku posługując się menu kontekstowym lub używając kombinacji klawiszy Ctrl+P. System Windows pozwala zapisać każdy wydruk do formatu PDF i uzyskujemy podobną funkcjonalność bez generowania plików PDF po stronie serwera.

Okno drukowania w Google Chrome

Możemy zwiększyć wygodę użytkowników dodając osobny link lub przycisk z funkcją onclick=”window.print()”. Np.:

<a href="#" onclick="window.print()">Drukuj / generuj PDF</a>

Co więcej, za pomocą zapytań medialnych możemy nadawać osobne style CSS dla ekranów i wydruków. Dla wydruku często usuwa się kolorowe tła i zwiększa kontrast pomiędzy tłem a tekstem:

@media print{
   .navbar-nav{
      display:none;
   }
   footer{
      background-color:#fff;
   }
   .content p{
      color:#000;
   }
} 

Należy pamiętać, że takie wydruki można zmanipulować poprzez edycję DOM po stronie przeglądarki. Nie jest to dobra metoda druku „ważnych” dokumentów.

Podsumowanie

Biblioteka mPDF zawiera wszystko czego trzeba do generowania plików PDF wprost z naszej aplikacji PHP. Dzięki prostocie działania zadowoli początkujących programistów i przyda się zarówno w mało skomplikowanych zadaniach jak i bardziej wymagających przypadkach. Mnogość opcji powinna zadowolić nawet szczegółowe i bardzo wymagające potrzeby.

Choć preferuję mPDF ze względu na prostotę użycia, korzystanie z innych popularnych bibliotek do generowania PDF nie powinno być znacznie trudniejsze. Zachęcam do zapoznania się z dokumentacją, która zawiera wiele ciekawych przykładów i proponuje skuteczne rozwiązania na najczęstsze wyzwania jakie mogą się pojawić przy projektowaniu dokumentów PDF w aplikacjach webowych.

Źródła

https://mpdf.github.io/

Oceń artykuł na temat: Generowanie plików PDF w PHP
Średnia : 4.8 , Maksymalnie : 5 , Głosów : 4


 

Odpowiedz lub skomentuj

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


 

Następny artykuł

Wykryto brak połączenia z Internetem.