Stvaranje PDF datoteka na Javi

1. Uvod

U ovom brzom članku usredotočit ćemo se na stvaranje PDF dokumenta od nule na temelju popularne iText i PdfBox biblioteke.

2. Ovisnosti Mavena

Pogledajmo ovisnosti Mavena, koje treba uključiti u naš projekt:

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

Najnoviju verziju knjižnica možete pronaći ovdje: iText i PdfBox.

Potrebna je dodatna ovisnost, u slučaju da će naša datoteka trebati biti šifrirana. Paket Bounty Castle Provider sadrži implementacije kriptografskih algoritama i potreban je u obje knjižnice:

 org.bouncycastle bcprov-jdk15na 1.56 

Najnoviju verziju knjižnice možete pronaći ovdje: The Bounty Castle Provider.

3. Pregled

IText i PdfBox su Java knjižnice koje se koriste za stvaranje / manipulaciju pdf datotekama. Iako je konačni rezultat knjižnica jednak, one djeluju na malo drugačiji način. Pogledajmo ih.

4. Stvorite PDF u IText-u

4.1. Umetnite tekst u PDF

Pogledajmo način na koji je nova datoteka s tekstom "Hello World" umetnuta u pdf datoteku

Dokument dokumenta = novi dokument (); PdfWriter.getInstance (dokument, novi FileOutputStream ("iTextHelloWorld.pdf")); document.open (); Font fonta = FontFactory.getFont (FontFactory.COURIER, 16, BaseColor.BLACK); Chunk chunk = novi Chunk ("Hello World", font); document.add (komad); document.close ();

Stvaranje pdf-a pomoću biblioteke iText temelji se na manipulaciji provedbom objekata Elementi sučelje u Dokument (u verziji 5.5.10 postoji 45 tih implementacija).

Pozva se najmanji element koji se može dodati u dokument i upotrijebiti Komad, koji je u osnovi niz s primijenjenim fontom.

Dodatno, Komad'S se mogu kombinirati s drugim elementima poput Odlomci, Odjeljak itd. što rezultira dokumentima lijepog izgleda.

4.2. Umetanje slike

Knjižnica iText omogućuje jednostavan način dodavanja slike u dokument. Jednostavno moramo stvoriti Slika instanci i dodajte je u Dokument.

Put puta = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); Dokument dokumenta = novi dokument (); PdfWriter.getInstance (dokument, novi FileOutputStream ("iTextImageExample.pdf")); document.open (); Slika img = Image.getInstance (path.toAbsolutePath (). ToString ()); document.add (img); document.close ();

4.3. Umetanje tablice

Mogli bismo se suočiti s problemom kada bismo željeli dodati tablicu u naš pdf. Srećom, iText pruža takvu funkcionalnost izvan okvira.

Prvo što moramo učiniti je stvoriti PdfTable object i u konstruktoru pružaju brojne stupce za našu tablicu. Sada jednostavno možemo dodati novu ćeliju pozivanjem

Sada možemo jednostavno dodati novu ćeliju pozivajući addCell metoda na novostvorenom objektu tablice. iText će stvoriti retke tablice sve dok su definirane sve potrebne ćelije, što znači da će, nakon što stvorite tablicu s 3 stupca i dodajte joj 8 ćelija, biti prikazana samo 2 retka s po 3 ćelije u svakoj.

Pogledajmo primjer:

Dokument dokumenta = novi dokument (); PdfWriter.getInstance (dokument, novi FileOutputStream ("iTextTable.pdf")); document.open (); Tablica PdfPTable = nova PdfPTable (3); addTableHeader (tablica); addRows (tablica); addCustomRows (tablica); document.add (tablica); document.close ();

Izrađujemo novu tablicu s 3 stupca i 3 retka. Prvi red tretirat ćemo kao zaglavlje tablice s promijenjenom bojom pozadine i širinom obruba:

private void addTableHeader (tablica PdfPTable) {Stream.of ("zaglavlje stupca 1", "zaglavlje stupca 2", "zaglavlje stupca 3"). forEach (titleTutle -> {PdfPCell header = new PdfPCell (); header.setBackgroundColor (BaseColor .LIGHT_GRAY); header.setBorderWidth (2); header.setPhrase (nova fraza (columnTitle)); table.addCell (zaglavlje);}); }

Drugi će se red sastojati od tri ćelije samo s tekstom, bez dodatnog oblikovanja.

private void addRows (tablica PdfPTable) {table.addCell ("red 1, kolona 1"); table.addCell ("red 1, kolona 2"); table.addCell ("red 1, kolona 3"); }

U stanice ne možemo uključiti samo tekst, već i slike. Uz to, svaka ćelija može se formatirati pojedinačno, u dolje predstavljenom primjeru primjenjujemo prilagodbe vodoravnog i okomitog poravnanja:

private void addCustomRows (tablica PdfPTable) baca URISyntaxException, BadElementException, IOException {Put puta = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). toURI ()); Slika img = Image.getInstance (path.toAbsolutePath (). ToString ()); img.scalePercent (10); PdfPCell imageCell = novi PdfPCell (img); table.addCell (imageCell); PdfPCell horizontalAlignCell = novi PdfPCell (nova fraza ("redak 2, stupac 2")); horizontalAlignCell.setHorizontalAlignment (Element.ALIGN_CENTER); table.addCell (horizontalAlignCell); PdfPCell verticalAlignCell = novi PdfPCell (nova fraza ("redak 2, stupac 3")); verticalAlignCell.setVerticalAlignment (Element.ALIGN_BOTTOM); table.addCell (verticalAlignCell); }

4.4. Šifriranje datoteke

Da bismo primijenili dozvolu pomoću iText biblioteke, moramo već stvoriti pdf dokument. U našem ćemo primjeru koristiti naš iTextHelloWorld.pdf datoteka generirana ranije.

Nakon što datoteku učitamo pomoću PdfReader, moramo stvoriti PdfStamper koji se koristi za primjenu dodatnog sadržaja na datoteku poput metapodataka, šifriranja itd .:

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

U našem smo primjeru datoteku šifrirali s dvije lozinke. Korisnička lozinka ("userpass") gdje korisnik ima samo pravo samo za čitanje, bez mogućnosti ispisa, i vlasnička lozinka ("ownerpass") koja se koristi kao glavni ključ omogućavajući osobi da ima puni pristup pdf-u.

Ako želimo dopustiti korisniku ispis pdf-a, umjesto 0 (treći parametar setEncryption) možemo proći:

PdfWriter.ALLOW_PRINTING

Naravno, možemo kombinirati različita dopuštenja poput:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Imajte na umu da pomoću iText-a za postavljanje dozvola za pristup stvaramo i privremeni pdf koji treba izbrisati, a ako ne, mogao bi biti u potpunosti dostupan svima.

5. Stvorite Pdf u PdfBoxu

5.1. Umetnite tekst u PDF

Suprotno od iText, PdfBox knjižnica nudi API koji se temelji na manipulaciji streamom. Ne postoje razredi poput Komad/Stavak itd. The PDDokumenta klasa je Pdf prikaz u memoriji u koji korisnik upisuje podatke manipulirajući PDPageContentStream razred.

Pogledajmo primjer koda:

PDDocument dokument = novi PDDocument (); PDPage stranica = nova PDPage (); document.addPage (stranica); PDPageContentStream contentStream = novi PDPageContentStream (dokument, stranica); contentStream.setFont (PDType1Font.COURIER, 12); contentStream.beginText (); contentStream.showText ("Pozdrav svijetu"); contentStream.endText (); contentStream.close (); document.save ("pdfBoxHelloWorld.pdf"); document.close ();

5.2. Umetanje slike

Umetanje slika je jednostavno.

Prvo moramo učitati datoteku i stvoriti PDImageXObject, zatim ga nacrtajte na dokumentu (potrebno je navesti točne x, y koordinate).

To je sve:

PDDocument dokument = novi PDDocument (); PDPage stranica = nova PDPage (); document.addPage (stranica); Put puta = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); PDPageContentStream contentStream = novi PDPageContentStream (dokument, stranica); PDImageXObject image = PDImageXObject.createFromFile (path.toAbsolutePath (). ToString (), dokument); contentStream.drawImage (slika, 0, 0); contentStream.close (); document.save ("pdfBoxImage.pdf"); document.close (); 

5.3. Umetanje tablice

Nažalost, PdfBox ne pruža nikakve gotove metode koje omogućuju stvaranje tablica. Ono što možemo učiniti u takvoj situaciji je crtati ga ručno - doslovno crtati svaku liniju sve dok naš crtež ne bude sličan našem sanjanom stolu.

5.4. Šifriranje datoteke

PdfBox Biblioteka pruža mogućnost šifriranja i prilagođavanja dozvola za datoteke za korisnika. Uspoređujući s iText, ne zahtijeva upotrebu već postojeće datoteke, kao što mi jednostavno koristimo PDDokumenta. Dozvolama za PDF datoteke obrađuje AccessPermission klase, gdje možemo postaviti hoće li korisnik moći mijenjati, izdvajati sadržaj ili ispisati datoteku.

Nakon toga kreiramo StandardProtectionPolicy objekt koji dokumentu dodaje zaštitu zasnovan na lozinci. Možemo odrediti dvije vrste lozinke. Korisnička lozinka, nakon koje će osoba moći otvoriti datoteku s primijenjenim dozvolama za pristup i lozinkom vlasnika (bez ograničenja za datoteku):

PDDocument dokument = novi PDDocument (); PDPage stranica = nova PDPage (); document.addPage (stranica); AccessPermission accessPermission = novi AccessPermission (); accessPermission.setCanPrint (netačno); accessPermission.setCanModify (false); StandardProtectionPolicy standardProtectionPolicy = novi StandardProtectionPolicy ("ownerpass", "userpass", accessPermission); document.protect (standardProtectionPolicy); document.save ("pdfBoxEncryption.pdf"); document.close (); 

Naš primjer predstavlja situaciju da ako korisnik navede korisničku lozinku, datoteka se ne može mijenjati i ispisivati.

6. Zaključci

U ovom uputstvu raspravljali smo o načinima stvaranja pdf datoteke u dvije popularne Java knjižnice.

Cjelovite primjere možete pronaći u projektu temeljenom na Mavenu na GitHubu.