Vytváranie súborov PDF v prostredí Java

1. Úvod

V tomto rýchlom článku sa zameriame na vytváranie dokumentov PDF od začiatku na základe populárnej knižnice iText a PdfBox.

2. Maven závislosti

Poďme sa pozrieť na závislosti Maven, ktoré je potrebné zahrnúť do nášho projektu:

 com.itextpdf itextpdf 5.5.10 org.apache.pdfbox pdfbox 2.0.4 

Najnovšiu verziu knižníc nájdete tu: iText a PdfBox.

Je potrebné pridať ešte jednu závislosť, pre prípad, že bude potrebné náš súbor zašifrovať. Balík Bounty Castle Provider obsahuje implementácie kryptografických algoritmov a je vyžadovaný oboma knižnicami:

 org.bouncycastle bcprov-jdk15on 1.56 

Najnovšiu verziu knižnice nájdete tu: Poskytovateľ hradu Bounty.

3. Prehľad

IText aj PdfBox sú knižnice Java používané na vytváranie / manipuláciu so súbormi PDF. Aj keď konečný výstup z knižníc je rovnaký, fungujú trochu iným spôsobom. Poďme sa na ne pozrieť.

4. Vytvorte PDF v IText

4.1. Vložte text do PDF

Pozrime sa, ako sa do súboru PDF vkladá nový súbor s textom „Hello World“

Dokumentový dokument = nový dokument (); PdfWriter.getInstance (dokument, nový FileOutputStream ("iTextHelloWorld.pdf")); document.open (); Font font = FontFactory.getFont (FontFactory.COURIER, 16, BaseColor.BLACK); Chunk chunk = nový Chunk ("Hello World", písmo); document.add (kus); document.close ();

Vytvorenie súboru PDF s využitím knižnice iText je založené na implementácii manipulácie s objektmi Prvky rozhranie v Dokument (vo verzii 5.5.10 je týchto implementácií 45).

Volá sa najmenší prvok, ktorý je možné pridať do dokumentu a použiť Kus, čo je v podstate reťazec s použitým písmom.

Navyše, KusJe možné kombinovať s inými prvkami, ako je Odseky, Oddiel a výsledkom sú pekne vyzerajúce dokumenty.

4.2. Vkladanie obrázka

Knižnica iText poskytuje jednoduchý spôsob pridania obrázka do dokumentu. Musíme jednoducho vytvoriť Obrázok inštanciu a pridať ju do súboru Dokument.

Cesta cesty = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); Dokumentový dokument = nový dokument (); PdfWriter.getInstance (dokument, nový FileOutputStream ("iTextImageExample.pdf")); document.open (); Obrázok img = Image.getInstance (path.toAbsolutePath (). ToString ()); document.add (img); document.close ();

4.3. Vkladacia tabuľka

Môžeme naraziť na problém, keď by sme chceli pridať tabuľku do nášho súboru pdf. Našťastie iText poskytuje takúto funkčnosť priamo z krabice.

Najskôr je potrebné vytvoriť PdfTable objekt a v konštruktore poskytujú pre našu tabuľku množstvo stĺpcov. Teraz môžeme jednoducho pridať novú bunku zavolaním

Teraz môžeme jednoducho pridať novú bunku zavolaním na addCell metóda na novovytvorenom objekte tabuľky. iText vytvorí riadky tabuľky, pokiaľ sú definované všetky potrebné bunky, čo znamená, že akonáhle vytvoríte tabuľku s 3 stĺpcami a pridáte do nej 8 buniek, zobrazia sa iba 2 riadky s 3 bunkami v každej.

Pozrime sa na príklad:

Dokumentový dokument = nový dokument (); PdfWriter.getInstance (dokument, nový FileOutputStream ("iTextTable.pdf")); document.open (); Tabuľka PdfPTable = nová PdfPTable (3); addTableHeader (tabuľka); addRows (tabuľka); addCustomRows (tabuľka); document.add (tabuľka); document.close ();

Vytvoríme novú tabuľku s 3 stĺpcami a 3 riadkami. Prvý riadok považujeme za hlavičku tabuľky so zmenenou farbou pozadia a šírkou orámovania:

private void addTableHeader (tabuľka PdfPTable) {Stream.of ("hlavička stĺpca 1", "hlavička stĺpca 2", "hlavička stĺpca 3") .forEach (columnTitle -> {PdfPCell hlavička = nová PdfPCell (); header.setBackgroundColor (BaseColor .LIGHT_GRAY); header.setBorderWidth (2); header.setPhrase (nová fráza (columnTitle)); table.addCell (hlavička);}); }

Druhý riadok bude zložený z troch buniek iba s textom, bez ďalšieho formátovania.

private void addRows (PdfPTable table) {table.addCell ("riadok 1, stĺpec 1"); table.addCell ("riadok 1, stĺpec 2"); table.addCell ("riadok 1, stĺpec 3"); }

Môžeme zahrnúť nielen text do buniek, ale aj obrázky. Každá bunka môže byť navyše naformátovaná individuálne, v príklade uvedenom nižšie použijeme úpravy vodorovného a zvislého zarovnania:

private void addCustomRows (PdfPTable table) throws URISyntaxException, BadElementException, IOException {Path path = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). toURI ()); Obrázok img = Image.getInstance (path.toAbsolutePath (). ToString ()); img.scalePercent (10); PdfPCell imageCell = nový PdfPCell (obrázok); table.addCell (imageCell); PdfPCell horizontalAlignCell = nový PdfPCell (nová fráza ("riadok 2, stĺpec 2")); horizontalAlignCell.setHorizontalAlignment (Element.ALIGN_CENTER); table.addCell (horizontalAlignCell); PdfPCell verticalAlignCell = nový PdfPCell (nová fráza ("riadok 2, stĺpec 3")); verticalAlignCell.setVerticalAlignment (Element.ALIGN_BOTTOM); table.addCell (verticalAlignCell); }

4.4. Šifrovanie súborov

Aby sme mohli použiť povolenie pomocou knižnice iText, musíme mať už vytvorený dokument PDF. V našom príklade použijeme náš iTextHelloWorld.pdf súbor vygenerovaný predtým.

Akonáhle načítame súbor pomocou PdfReader, musíme vytvoriť PdfStamper ktorý sa používa na použitie ďalšieho obsahu do súboru, ako sú metadáta, šifrovanie atď:

PdfReader pdfReader = nový PdfReader ("HelloWorld.pdf"); PdfStamper pdfStamper = nový PdfStamper (pdfReader, nový FileOutputStream ("encryptedPdf.pdf")); pdfStamper.setEncryption ("userpass" .getBytes (), ".getBytes (), 0, PdfWriter.ENCRYPTION_AES_256); pdfStamper.close ();

V našom príklade sme súbor zašifrovali dvoma heslami. Používateľské heslo („userpass“), kde má používateľ iba právo iba na čítanie bez možnosti jeho vytlačenia, a heslo vlastníka („passpass“), ktoré sa používa ako hlavný kľúč umožňujúci osobe úplný prístup k súboru PDF.

Ak chceme užívateľovi umožniť tlačiť pdf, namiesto 0 (tretí parameter z) setEncryption) môžeme odovzdať:

PdfWriter.ALLOW_PRINTING

Samozrejme môžeme kombinovať rôzne povolenia, ako napríklad:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Majte na pamäti, že pomocou iTextu na nastavenie prístupových oprávnení tiež vytvárame dočasné pdf, ktoré by malo byť vymazané a ak nie, mohlo by byť úplne prístupné pre kohokoľvek.

5. Vytvorte Pdf v PdfBoxe

5.1. Vložte text do PDF

Ako oproti iText, PdfBox Knižnica poskytuje API, ktoré je založené na manipulácii s prúdom. Nie sú tu žiadne triedy ako Kus/Odstavec atď PDDocument trieda je reprezentácia Pdf v pamäti, kde užívateľ píše údaje manipuláciou PDPageContentStream trieda.

Pozrime sa na príklad kódu:

Dokument PDDocument = nový PDDocument (); Stránka PDPage = nová stránka PDPage (); document.addPage (stránka); PDPageContentStream contentStream = nový PDPageContentStream (dokument, stránka); contentStream.setFont (PDType1Font.COURIER, 12); contentStream.beginText (); contentStream.showText („Hello World“); contentStream.endText (); contentStream.close (); document.save ("pdfBoxHelloWorld.pdf"); document.close ();

5.2. Vkladanie obrázka

Vkladanie obrázkov je jednoduché.

Najprv musíme načítať súbor a vytvoriť a PDImageXObject, následne ho nakreslite na dokument (je potrebné uviesť presné súradnice x, y).

To je všetko:

Dokument PDDocument = nový PDDocument (); Stránka PDPage = nová stránka PDPage (); document.addPage (stránka); Cesta cesty = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); PDPageContentStream contentStream = nový PDPageContentStream (dokument, stránka); Obrázok PDImageXObject = PDImageXObject.createFromFile (cesta.toAbsolutePath (). ToString (), dokument); contentStream.drawImage (obrázok, 0, 0); contentStream.close (); document.save ("pdfBoxImage.pdf"); document.close (); 

5.3. Vloženie tabuľky

Bohužiaľ PdfBox neposkytuje žiadne metódy pripravené na použitie, ktoré umožňujú vytváranie tabuliek. Čo môžeme v takejto situácii urobiť, je nakresliť to ručne - doslova, nakresliť každú čiaru, kým sa naša kresba nebude podobať našej vysnívanej tabuľke.

5.4. Šifrovanie súborov

PdfBox Knižnica poskytuje používateľovi možnosť zašifrovať a upraviť povolenie súboru. V porovnaní s iText, nevyžaduje použitie už existujúceho súboru, ako to jednoducho používame PDDocument. Povolenia súborov PDF spracováva server AccessPermission triedy, kde môžeme nastaviť, či bude mať používateľ možnosť upravovať, extrahovať obsah alebo tlačiť súbor.

Následne vytvoríme a StandardProtectionPolicy objekt, ktorý dokumentu dodáva ochranu na základe hesla. Môžeme určiť dva typy hesla. Heslo používateľa, po ktorom bude môcť osoba otvoriť súbor s uplatnenými prístupovými povoleniami a heslom vlastníka (bez obmedzenia súboru):

Dokument PDDocument = nový PDDocument (); Stránka PDPage = nová stránka PDPage (); document.addPage (stránka); AccessPermission accessPermission = nový AccessPermission (); accessPermission.setCanPrint (false); accessPermission.setCanModify (false); StandardProtectionPolicy standardProtectionPolicy = nový StandardProtectionPolicy ("ownerpass", "userpass", accessPermission); document.protect (standardProtectionPolicy); document.save ("pdfBoxEncryption.pdf"); document.close (); 

Náš príklad predstavuje situáciu, že ak používateľ zadá heslo používateľa, súbor nie je možné upraviť a vytlačiť.

6. Závery

V tomto tutoriáli sme diskutovali o spôsoboch vytvorenia súboru pdf v dvoch populárnych knižniciach Java.

Celé príklady nájdete v projekte založenom na Maven na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found