Wprowadzenie
W tym krótkim artykule, skupimy się na tworzeniu dokumentu PDF od podstaw w oparciu o popularne biblioteki iText i PdfBox.
Zależności Maven
Przyjrzyjrzyjmy się zależnościom Maven, które muszą znaleźć się w naszym projekcie:
Najnowsze wersje bibliotek można znaleźć tutaj: iText i PdfBox.
Jedna dodatkowa zależność jest konieczna do dodania, w przypadku gdy nasz plik będzie musiał być zaszyfrowany. Pakiet Bounty Castle Provider zawiera implementacje algorytmów kryptograficznych i jest wymagany przez obie biblioteki:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>
Najnowszą wersję biblioteki można znaleźć tutaj: The Bounty Castle Provider.
Overview
Obydwie, iText i PdfBox są bibliotekami java używanymi do tworzenia/manipulacji plikami pdf. Chociaż końcowy wynik działania tych bibliotek jest taki sam, działają one w nieco inny sposób. Przyjrzyjmy się im.
Create Pdf in IText
4.1. Insert Text in Pdf
Przyjrzyjrzyjmy się, w jaki sposób nowy plik z tekstem „Hello World” jest wstawiany do pliku pdf
Tworzenie pdf z wykorzystaniem biblioteki iText polega na manipulowaniu obiektami implementującymi interfejs Elements w Document (w wersji 5.5.10 jest 45 takich implementacji).
Najmniejszym elementem, który może być dodany do dokumentu i użyty jest Chunk, który jest w zasadzie łańcuchem znaków z zastosowaną czcionką.
Dodatkowo, Chunk’s mogą być łączone z innymi elementami takimi jak Paragraphs, Section itp. dając w efekcie ładnie wyglądające dokumenty.
4.2. Wstawianie obrazu
Biblioteka iText zapewnia łatwy sposób na dodanie obrazu do dokumentu. Wystarczy, że utworzymy instancję Image i dodamy ją do dokumentu.
4.3. Wstawianie tabeli
Możemy napotkać problem, gdy chcielibyśmy dodać tabelę do naszego pdf. Na szczęście iText zapewnia taką funkcjonalność out-of-the-box.
Pierwsze co musimy zrobić to stworzyć obiekt PdfTable i w konstruktorze podać ilość kolumn dla naszej tabeli. Teraz możemy po prostu dodać nową komórkę wywołując
Teraz możemy po prostu dodać nową komórkę wywołując metodę addCell na nowo utworzonym obiekcie tabeli. iText utworzy wiersze tabeli tak długo, jak wszystkie niezbędne komórki będą zdefiniowane, co oznacza, że po utworzeniu tabeli z 3 kolumnami i dodaniu do niej 8 komórek, wyświetlone zostaną tylko 2 wiersze z 3 komórkami w każdym.
Przyjrzyjrzyjrzyjmy się przykładowi:
Tworzymy nową tabelę z 3 kolumnami i 3 wierszami. Pierwszy wiersz potraktujemy jako nagłówek tabeli ze zmienionym kolorem tła i szerokością obramowania:
Drugi wiersz będzie się składał z trzech komórek zawierających tylko tekst, bez dodatkowego formatowania.
private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}
W komórkach możemy umieszczać nie tylko tekst, ale również obrazki. Dodatkowo każda komórka może być formatowana indywidualnie, w przykładzie przedstawionym poniżej stosujemy korekty wyrównania poziomego i pionowego:
4.4. Szyfrowanie plików
Aby zastosować uprawnienia z wykorzystaniem biblioteki iText, musimy mieć już utworzony dokument pdf. W naszym przykładzie, użyjemy naszego pliku iTextHelloWorld.pdf wygenerowanego wcześniej.
Po załadowaniu pliku za pomocą PdfReader, musimy utworzyć PdfStamper, który jest używany do zastosowania dodatkowej zawartości do pliku jak metadane, szyfrowanie itp:
W naszym przykładzie, zaszyfrowaliśmy plik dwoma hasłami. Hasło użytkownika („userpass”), gdzie użytkownik ma tylko prawo do odczytu bez możliwości drukowania, oraz hasło właściciela („ownerpass”), które jest używane jako klucz główny pozwalający danej osobie na pełny dostęp do pdf.
Jeśli chcemy pozwolić użytkownikowi na drukowanie pdf, zamiast 0 (trzeci parametr setEncryption) możemy podać:
PdfWriter.ALLOW_PRINTING
Oczywiście, możemy mieszać różne uprawnienia jak:
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY
Pamiętajmy, że używając iText do ustawienia uprawnień dostępu, tworzymy również tymczasowy pdf, który powinien zostać usunięty, a jeśli nie, może być w pełni dostępny dla każdego.
Tworzenie plików Pdf w PdfBox
5.1. Insert Text in Pdf
Jako przeciwieństwo iText, biblioteka PdfBox dostarcza API, które opiera się na manipulacji strumieniem. Nie ma klas takich jak Chunk/Paragraph itp. Klasa PDDocument jest reprezentacją Pdf w pamięci, gdzie użytkownik zapisuje dane poprzez manipulację klasą PDPageContentStream.
Przyjrzyjrzyjmy się przykładowemu kodowi:
5.2. Wstawianie obrazu
Wstawianie obrazów jest proste.
Najpierw musimy wczytać plik i utworzyć obiekt PDImageXObject, a następnie narysować go na dokumencie (należy podać dokładne współrzędne x,y).
To wszystko:
5.3. Wstawianie tabeli
Niestety PdfBox nie udostępnia żadnych metod out-of-box pozwalających na tworzenie tabel. To co możemy zrobić w takiej sytuacji to narysować ją ręcznie – dosłownie, rysować każdą linię tak długo, aż nasz rysunek będzie przypominał naszą wymarzoną tabelę.
5.4. Szyfrowanie plików
Biblioteka PdfBox daje możliwość szyfrowania, oraz ustawiania uprawnień plików dla użytkownika. W porównaniu do iText, nie wymaga użycia już istniejącego pliku, gdyż po prostu korzystamy z PDDocument. Uprawnienia do plików Pdf są obsługiwane przez klasę AccessPermission, w której możemy ustawić, czy użytkownik będzie mógł modyfikować, wydobywać zawartość lub drukować plik.
Następnie tworzymy obiekt StandardProtectionPolicy, który dodaje do dokumentu ochronę opartą na haśle. Możemy określić dwa rodzaje haseł. Hasło użytkownika, po którym osoba będzie mogła otworzyć plik z zastosowanymi uprawnieniami dostępu oraz hasło właściciela (brak ograniczeń do pliku):
Nasz przykład przedstawia sytuację, że jeżeli użytkownik poda hasło użytkownika, to pliku nie będzie można modyfikować i drukować.
Wnioski
W tym tutorialu omówiliśmy sposoby tworzenia pliku pdf w dwóch popularnych bibliotekach Javy.
Pełne przykłady można znaleźć w projekcie opartym na Mavenie na GitHubie.
Zacznij przygodę ze Spring 5 i Spring Boot 2, dzięki kursowi Learn Spring:
>> CHECK OUT THE COURSE
.