Generowanie dokumentów w postaci plików PDF
Hej,
utrzymując tematykę generowania dokumentów z poprzedniego posta zdecydowałem się napisać co nieco o tworzeniu plików w formacie PDF.
Rozpatrzmy dwa scenariusze: - generowanie dokumentu bezpośrednio w postaci PDF - konwersja dokumentu z innego formatu
Nie zamierzam przedstawiać tu przekroju przez wszystkie znane lub dostępne rozwiązania i wymieniać ich wad czy zalet. Chciałbym opisać natomiast kilka znanych mi sposobów, które mogą być używane w większości praktycznych zastosowań.
Generowanie dokumentu
W tym przypadku istnieje przynajmniej kilka darmowych bibliotek, którymi możemy posłużyć. Niektóre wyraźnie różnią się od innych, skupiając się na odmiennych aspektach generacji dokumentu. Dzięki temu możemy wybrać bibliotekę, która najbardziej odpowiada naszym oczekiwaniom.
Wymienię tutaj trzy z nich:
- iText / iTextSharp Są to biblioteki dla programów napisanych w oparciu o .NET lub język Java. Udostępniają narzędzia ułatwiające m. in.: formatowanie tworzonego tekstu, generowanie tabel, tworzenie zakładek, czy dodawanie interaktywnych treści. Na stronie programu dostępne są kody źródłowe demonstrujące sposób użycia poszczególnych funkcjonalności udostępnianych przez biblioteką. W internecie można także odnaleźć tutoriale oraz inne informacje o tym jak należy używać jej we własnych aplikacjach. Warto w tym przypadku zwrócić uwagę na licencję, która jest przystosowana bardziej do celów hobbystycznych lub darmowych aplikacji i często nie jest odpowiadająca dla zastosowań komercyjnych. Wykupienie wersji płatnej pozwala jednak na usunięcie pewnych ograniczeń. Więcej informacji można znaleźć na oficjalnej stronie biblioteki.
- PDFSharp Biblioteka zawierająca mniejsze ograniczenia licencyjne :), wydana na licencji MIT. Obsługuje on formaty PDF od wersji 1.2 (Adobe Acrobat Reader 3.0) do 1.7 (Adobe Reader 8.0). Pełne wsparcie udostępnione jest dla wersji 1.4, w przypadku 1.5 obsługa niektórych funkcjonalności nie została jeszcze zaimplementowana. Podejście do generowania w tym przypadku różni się nieco od opisanego wcześniej. Udostępnione metody operują na nieco niższym poziomie abstrakcji. Mamy do dyspozycji generowanie tekstu i możliwość wstawiania prostych elementów graficznych i obrazków, jednak za znaczną część formatowania odpowiada sam programista. Biblioteka nie udostępnia też np.: automatycznego wstawiania stron czy funkcji do tworzenia tabel. PDFSharp może być natomiast bardzo przydatny w przypadku dokumentów z grafiką, jeśli chcemy mieć pełną kontrolę nad dokładnym rozmieszczeniem wszystkich elementów.
- MigraDoc Wydana również na licencji MIT. Jest to biblioteka zbudowana na bazie PDFSharp, jednak udostępnia znacznie więcej funkcji związanych z formatowaniem dokumentów. Posiada również wsparcie dla tworzenia tabel, automatycznego dodawania stron itp. Przydatna dla generowania dokumentów PDF w przypadku, gdy nie jest ważne dokładne położenie elementów i ich formatowanie możemy pozostawić automatycznym funkcjom. Wadą tej biblioteki jest nieco nieintuicyjne użycie np.: słyszałem o sytuacjach, kiedy daną funkcjonalność można teoretycznie zrealizować na kilka sposobów, jednak nie wszystkie z nich działają prawidłowo. Należy więc czasem uzbroić się w cierpliwość. Nie jest to jednak cechą wymaganą od programisty tylko przez tę jedną bibliotekę ;).
Na stronie PDFSharp i MirgaDoc możemy również znaleźć przykłady demonstrujące sposób ich użycia w konkretnych przypadkach. Warto także zwrócić uwagę, że obu bibliotek można używać razem, korzystając z funkcjonalności każdej z nich w sposób jak najbardziej dopasowany do naszych potrzeb.
Konwersja istniejącego dokumentu
W tym scenariuszu istnieje możliwość użycia specjalnego konwertera. W przypadku bezpłatnych są to zwykle konwertery online. Nie znalazłem żadnej darmowej aplikacji offline, która oferowałaby taką funkcjonalność. Jeśli ktoś zna i chce się podzielić z innymi informacją o nim, zachęcam :).
Jeśli możemy użyć Automation for Office (opisany trochę szerzej w moim poprzednim artykule), mamy znacznie ułatwione zadanie. W Office 2007 można pobrać ze strony Microsoftu specjalny dodatek umożliwiający zapis w formacie PDF lub skorzystać z możliwości wydruku do pliku PDF przy użyciu odpowiedniej aplikacji. Pamiętajmy jednak o zachowaniu ostrożności jeśli zamierzamy użyć tego rozwiązania w środowisku serwerowym.
Kolejną, jednak najbardziej żmudną w realizacji opcją jest stworzenie własnego konwertera plików z pewnego formatu do PDF. Wymaga to niewątpliwie dużo pracy, jednak jeśli napiszemy taki konwerter jako samodzielny moduł o odpowiednim poziomie uniwersalności, możemy użyć go również w swoich późniejszych projektach :).
Podsumowanie
Artykuł ten miał za zadanie zaprezentować kilka wybranych rozwiązań darmowych, które umożliwiają tworzenie nowych lub konwersję istniejących dokumentów do formatu PDF. Jeśli znasz nie wymienioną tutaj bibliotekę lub sposób generacji PDFów wart uwagi, podziel się z innymi pisząc komentarz z informacją bądź linkiem :).
Pozdrawiam,
Łukasz
P.S.
W komentarzach pojawiło się kilka innych, ciekawych rozwiązań: - ReportLab Open Source Silnik do generacji PDFów, napisany w Pythonie. Dostępny również w płatnej wersji o większych możliwościach. - LaTeX Można tworzyć dokumenty w formacie LaTeXa, a następnie konwertować je do PDFów przy użyciu pdflatex.
Dziękuję wszystkim za komentarze :).