Vytváření PDF souborů v Javě

Úvod

V tomto krátkém článku se zaměříme na vytváření PDF dokumentu od nuly na základě populárních knihoven iText a PdfBox.

Závislosti Maven

Podívejme se na závislosti Maven, které je třeba zahrnout do našeho projektu:

Nejnovější verze knihoven najdete zde: iText a PdfBox.

Jednu závislost navíc je třeba přidat pro případ, že náš soubor bude třeba zašifrovat. Balíček Bounty Castle Provider obsahuje implementace kryptografických algoritmů a je vyžadován oběma knihovnami:

<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>

Nejnovější verzi knihovny najdete zde:

Přehled

Obě knihovny, iText i PdfBox, jsou javovské knihovny používané pro vytváření/manipulaci se soubory pdf. Přestože konečný výstup knihoven je stejný, pracují trochu odlišným způsobem. Pojďme se na ně podívat.

Vytvoření Pdf v IText

4.1. Vložení textu do Pdf

Podívejme se, jakým způsobem se do pdf souboru vloží nový soubor s textem „Hello World“

Vytvoření pdf pomocí knihovny iText je založeno na manipulaci s objekty implementujícími rozhraní Elements v Document (ve verzi 5.5.10 je těchto implementací 45).

Nejmenší prvek, který lze do dokumentu přidat a použít, se nazývá Chunk, což je v podstatě řetězec s použitým písmem.

Přídavně lze Chunk kombinovat s dalšími prvky, jako jsou Odstavce, Sekce atd. a výsledkem je pěkně vypadající dokument.

4.2. Prvky, které lze do dokumentu přidat a použít, se nazývají Chunk. Vložení obrázku

Knihovna iText poskytuje snadný způsob, jak do dokumentu přidat obrázek. Stačí, když vytvoříme instanci obrázku a přidáme ji do dokumentu.

4.3 Obrázek. Vložení tabulky

Můžeme se setkat s problémem, když bychom chtěli do našeho pdf přidat tabulku. Naštěstí iText takovou funkci poskytuje out-of-the-box.

Nejprve musíme vytvořit objekt PdfTable a v konstruktoru zadat počet sloupců pro naši tabulku. Nyní můžeme jednoduše přidat novou buňku voláním

Nyní můžeme jednoduše přidat novou buňku voláním metody addCell na nově vytvořeném objektu tabulky. iText vytvoří řádky tabulky, pokud jsou definovány všechny potřebné buňky, což znamená, že jakmile vytvoříte tabulku se 3 sloupci a přidáte do ní 8 buněk, zobrazí se pouze 2 řádky po 3 buňkách.

Podívejme se na příklad:

Vytvoříme novou tabulku se 3 sloupci a 3 řádky. První řádek budeme považovat za záhlaví tabulky se změněnou barvou pozadí a šířkou rámečku:

Druhý řádek budou tvořit tři buňky pouze s textem, bez dalšího formátování.

private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}

Do buněk můžeme vkládat nejen text, ale i obrázky. Každou buňku navíc můžeme formátovat samostatně, v níže uvedeném příkladu použijeme úpravu vodorovného a svislého zarovnání:

4.4. Buňka může být formátována samostatně. Šifrování souborů

Chceme-li použít oprávnění pomocí knihovny iText, musíme mít již vytvořený dokument pdf. V našem příkladu použijeme náš dříve vytvořený soubor iTextHelloWorld.pdf.

Po načtení souboru pomocí PdfReaderu musíme vytvořit PdfStamper, který slouží k aplikaci dalšího obsahu na soubor, jako jsou metadata, šifrování atd:

V našem příkladu jsme soubor zašifrovali dvěma hesly. Heslem uživatele („userpass“), kdy má uživatel pouze právo čtení bez možnosti tisku, a heslem vlastníka („ownerpass“), které se používá jako hlavní klíč umožňující osobě plný přístup k pdf.

Pokud chceme uživateli povolit tisk pdf, můžeme místo 0 (třetí parametr setEncryption) předat:

PdfWriter.ALLOW_PRINTING

Můžeme samozřejmě kombinovat různá oprávnění, například:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Mějte na paměti, že použitím iTextu pro nastavení přístupových práv vytváříme také dočasné pdf, které by mělo být smazáno, a pokud ne, mohlo by být plně přístupné komukoli.

Vytvoření Pdf v PdfBoxu

5.1. Vkládání textu do Pdf

Na rozdíl od iTextu poskytuje knihovna PdfBox rozhraní API, které je založeno na manipulaci s proudy. Neexistují zde žádné třídy jako Chunk/Paragraph atd. Třída PDDocument představuje reprezentaci Pdf v paměti, do které uživatel zapisuje data pomocí manipulace s třídou PDPageContentStream.

Podívejme se na příklad kódu:

5.2. Vložení obrázku

Vkládání obrázků je jednoduché.

Nejprve musíme načíst soubor a vytvořit objekt PDImageXObject, následně jej nakreslit na dokument (je třeba zadat přesné souřadnice x,y).

To je vše:

5.3. Vložení tabulky

PdfBox bohužel neposkytuje žádné out-of-box metody umožňující vytvoření tabulky. Co můžeme v takové situaci udělat, je nakreslit ji ručně – doslova kreslit jednotlivé čáry tak dlouho, dokud se náš výkres nebude podobat vysněné tabulce.

5.4 Kreslení tabulky. Šifrování souborů

Knihovna PdfBox poskytuje možnost šifrovat a upravovat práva k souborům pro uživatele. Oproti iTextu nevyžaduje použití již existujícího souboru, protože jednoduše použijeme PDDocument. Oprávnění souborů Pdf řeší třída AccessPermission, ve které můžeme nastavit, zda uživatel bude moci soubor upravovat, extrahovat obsah nebo tisknout.

Následně vytvoříme objekt StandardProtectionPolicy, který přidá dokumentu ochranu založenou na hesle. Můžeme zadat dva typy hesel. Heslo uživatele, po jehož zadání bude moci osoba otevřít soubor s aplikovanými přístupovými právy, a heslo vlastníka (bez omezení k souboru):

Náš příklad představuje situaci, že pokud uživatel zadá uživatelské heslo, nebude možné soubor upravovat a tisknout.

Závěry

V tomto tutoriálu jsme probrali způsoby vytvoření souboru pdf ve dvou populárních knihovnách jazyka Java.

Úplné příklady najdete v projektu založeném na systému Maven na serveru GitHub.

Začněte se Spring 5 a Spring Boot 2 prostřednictvím kurzu Naučte se Spring:

>> VYHLEDEJTE SI KURZ

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.