PDF fájlok létrehozása Java-ban

1. Bemutatkozás

Ebben a rövid cikkben a PDF dokumentumok elkészítéséről fogunk összpontosítani a népszerű iText és PdfBox könyvtár alapján.

2. Maven-függőségek

Vessünk egy pillantást a Maven-függőségekre, amelyeket be kell építeni a projektünkbe:

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

A könyvtárak legújabb verziója itt található: iText és PdfBox.

Egy további függőség szükséges hozzáadásra, arra az esetre, ha a fájlunkat titkosítani kell. A Bounty Castle Provider csomag kriptográfiai algoritmusok megvalósítását tartalmazza, és mindkét könyvtár megköveteli:

 org.bouncycastle bcprov-jdk15on 1.56 

A könyvtár legújabb verziója itt található: The Bounty Castle Provider.

3. Áttekintés

Az iText és a PdfBox egyaránt Java könyvtárak, amelyeket pdf fájlok létrehozására / kezelésére használnak. Bár a könyvtárak végső kimenete megegyezik, kissé másképp működnek. Vessünk egy pillantást rájuk.

4. Hozzon létre Pdf fájlt az IText fájlban

4.1. Szöveg beszúrása a PDF-be

Vessünk egy pillantást arra, hogy egy új „Hello World” szöveget tartalmazó fájl hogyan kerül beszúrásra a pdf fájlba

Dokumentumdokumentum = új Dokumentum (); PdfWriter.getInstance (dokumentum, új FileOutputStream ("iTextHelloWorld.pdf")); document.open (); Betűtípus = FontFactory.getFont (FontFactory.COURIER, 16, BaseColor.BLACK); Chunk chunk = new Chunk ("Hello World", betűtípus); document.add (chunk); document.close ();

A pdf létrehozása az iText könyvtár használatával az objektumok megvalósításának manipulálásán alapul Elemek interfész Dokumentum (az 5.5.10 változatban 45 ilyen megvalósítás van).

A legkisebb elemet, amely hozzáadható a dokumentumhoz és felhasználható, meghívjuk Chunk, amely alapvetően karakterlánc alkalmazott betűkészlettel.

Ezenkívül Chunk’S kombinálhatók más elemekkel, mint például Bekezdések, Szakasz stb., amelyek szép kinézetű dokumentumokat eredményeznek.

4.2. Kép beszúrása

Az iText könyvtár segítségével egyszerűen hozzáadhat képet a dokumentumhoz. Egyszerűen létre kell hoznunk egy Kép példányt, és adja hozzá a Dokumentum.

Elérési útvonal = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); Dokumentumdokumentum = új Dokumentum (); PdfWriter.getInstance (dokumentum, új FileOutputStream ("iTextImageExample.pdf")); document.open (); Image img = Image.getInstance (elérési út az AbsolutePath () -ig. ToString ()); document.add (img); document.close ();

4.3. Táblázat beszúrása

Problémával szembesülhetünk, ha táblázatot szeretnénk hozzáadni a pdf-fájlunkhoz. Szerencsére az iText out-of-the-box funkciót biztosít.

Először azt kell tennünk, hogy létrehozzuk a PdfTable Az object és a konstruktor számos oszlopot ad meg a táblázatunkhoz. Most egyszerűen felvehetünk új cellát hívással

Most egyszerűen hozzáadhatunk új cellát a addCell metódus az újonnan létrehozott táblaobjektumon. Az iText táblasorokat hoz létre mindaddig, amíg az összes szükséges cella meg van határozva. Ez azt jelenti, hogy ha egyszer létrehoz egy táblázatot 3 oszloppal és hozzáad 8 cellát, csak 2 sor jelenik meg, mindegyikben 3 cella.

Vessünk egy pillantást a példára:

Dokumentumdokumentum = új Dokumentum (); PdfWriter.getInstance (dokumentum, új FileOutputStream ("iTextTable.pdf")); document.open (); PdfPTable táblázat = új PdfPTable (3); addTableHeader (táblázat); addRows (táblázat); addCustomRows (táblázat); document.add (táblázat); document.close ();

Új táblázatot készítünk 3 oszlopból és 3 sorból. Az első sort megváltoztatott háttérszínnel és szegélyszélességgel rendelkező táblázat fejléceként kezeljük:

private void addTableHeader (PdfPTable tábla) {Stream.of ("oszlopfejléc 1", "oszlopfejléc 2", "oszlopfejléc 3") .forEach (columnTitle -> {PdfPCell header = new PdfPCell (); header.setBackgroundColor (BaseColor .LIGHT_GRAY); header.setBorderWidth (2); header.setPhrase (új kifejezés (columnTitle)); table.addCell (header);}); }

A második sor három cellából áll, csak szöveggel, extra formázás nélkül.

private void addRows (PdfPTable tábla) {table.addCell ("1. sor, 1. oszlop"); table.addCell ("1. sor, 2. oszlop"); table.addCell ("1. sor, 3. oszlop"); }

A cellákba nemcsak szöveget, hanem képeket is felvehetünk. Ezenkívül minden cella külön-külön is formázható, az alábbi példában vízszintes és függőleges igazításokat alkalmazunk:

private void addCustomRows (PdfPTable tábla) dobja az URISyntaxException, BadElementException, IOException {Path path = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). toURI ()); Image img = Image.getInstance (elérési út az AbsolutePath () -ig. ToString ()); img.scalePercent (10); PdfPCell imageCell = új PdfPCell (img); table.addCell (imageCell); PdfPCell horizontalAlignCell = új PdfPCell (új kifejezés ("2. sor, 2. oszlop")); horizontalAlignCell.setHorizontalAlignment (Element.ALIGN_CENTER); table.addCell (horizontalAlignCell); PdfPCell verticalAlignCell = új PdfPCell (új kifejezés ("2. sor, 3. oszlop")); verticalAlignCell.setVerticalAlignment (Element.ALIGN_BOTTOM); table.addCell (verticalAlignCell); }

4.4. Fájl titkosítás

Ahhoz, hogy engedélyt alkalmazzunk az iText könyvtár segítségével, létre kell hoznunk a pdf dokumentumot. Példánkban a mi iTextHelloWorld.pdf korábban generált fájl.

Miután betöltöttük a fájlt a PdfReader, létre kell hoznunk a PdfStamper amely további tartalom alkalmazására szolgál a fájlokban, például metaadatok, titkosítás stb.:

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

Példánkban két jelszóval titkosítottuk a fájlt. A felhasználói jelszó („userpass”), ahol a felhasználónak csak olvasható joga van, és nincs lehetősége annak nyomtatására, valamint a tulajdonos jelszó („tulajdonos jelszó”), amelyet főkulcsként használnak, lehetővé téve a személyek számára a teljes hozzáférést a pdf-hez.

Ha meg akarjuk engedni, hogy a felhasználó PDF helyett nyomtasson, a 0 helyett (a setEncryption) átadhatjuk:

PdfWriter.ALLOW_PRINTING

Természetesen különböző engedélyeket keverhetünk, például:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Ne feledje, hogy az iText segítségével a hozzáférési engedélyek beállításához egy ideiglenes pdf-t is létrehozunk, amelyet törölni kell, és ha nem, akkor bárki számára teljes mértékben elérhetővé válhat.

5. Hozzon létre Pdf-t a PdfBox-ban

5.1. Szöveg beszúrása a PDF-be

Ellentétben a iText, a PdfBox könyvtár biztosítja az API-t, amely folyammanipuláción alapul. Nincsenek olyan osztályok, mint Chunk/Bekezdés stb PDDocument osztály egy memóriában lévő Pdf reprezentáció, ahol a felhasználó manipulációval ír adatokat PDPageContentStream osztály.

Vessünk egy pillantást a kód példájára:

PDDocument document = új PDDocument (); PDPage page = új PDPage (); document.addPage (oldal); PDPageContentStream contentStream = új PDPageContentStream (dokumentum, oldal); contentStream.setFont (PDType1Font.COURIER, 12); contentStream.beginText (); contentStream.showText ("Hello World"); contentStream.endText (); contentStream.close (); document.save ("pdfBoxHelloWorld.pdf"); document.close ();

5.2. Kép beszúrása

Képek beszúrása egyszerű.

Először be kell töltenünk egy fájlt, és létre kell hoznunk a PDImageXObject, ezt követően rajzolja le a dokumentumra (pontos x, y koordinátákat kell megadnia).

Ez minden:

PDDocument document = új PDDocument (); PDPage page = új PDPage (); document.addPage (oldal); Elérési útvonal = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); PDPageContentStream contentStream = új PDPageContentStream (dokumentum, oldal); PDImageXObject image = PDImageXObject.createFromFile (elérési út az AbsolutePath () -ig. ToString (), dokumentum); contentStream.drawImage (image, 0, 0); contentStream.close (); document.save ("pdfBoxImage.pdf"); document.close (); 

5.3. Táblázat beszúrása

Sajnálatos módon, PdfBox nem nyújt semmilyen out-of-box módszert táblázatok létrehozására. Amit tehetünk ilyen helyzetben, az az, hogy manuálisan megrajzoljuk - szó szerint rajzoljuk meg az egyes vonalakat, amíg a rajzunk nem hasonlít a megálmodott asztalunkra.

5.4. Fájl titkosítás

PdfBox könyvtár lehetőséget nyújt a felhasználó titkosítására és a fájlengedélyek módosítására. Összehasonlítva iText, nem igényel már létező fájlt, mivel egyszerűen használjuk PDDocument. A Pdf fájl engedélyeit a AccessPermission osztály, ahol beállíthatjuk, hogy a felhasználó képes lesz-e módosítani, kibontani a tartalmat vagy kinyomtatni egy fájlt.

Ezt követően létrehozunk egy StandardProtectionPolicy objektum, amely jelszó alapú védelmet ad a dokumentumnak. Kétféle jelszót adhatunk meg. A felhasználói jelszó, amely után a felhasználó megnyithat egy fájlt alkalmazott hozzáférési jogosultságokkal és tulajdonos jelszóval (nincs korlátozás a fájlra):

PDDocument document = új PDDocument (); PDPage page = új PDPage (); document.addPage (oldal); AccessPermission accessPermission = új AccessPermission (); accessPermission.setCanPrint (hamis); accessPermission.setCanModify (hamis); StandardProtectionPolicy standardProtectionPolicy = új StandardProtectionPolicy ("tulajdonos áthelyezése", "felhasználói átmenet", hozzáférés engedély); document.protect (standardProtectionPolicy); document.save ("pdfBoxEncryption.pdf"); document.close (); 

Példánk olyan helyzetet mutat be, hogy ha a felhasználó megadja a felhasználói jelszót, akkor a fájlt nem lehet módosítani és kinyomtatni.

6. Következtetések

Ebben az oktatóanyagban megvitattuk a pdf fájl létrehozásának módját két népszerű Java könyvtárban.

A teljes példák megtalálhatók a GavenHub Maven alapú projektjében.