Oprettelse af PDF-filer i Java

1. Introduktion

I denne hurtige artikel fokuserer vi på at oprette PDF-dokument fra bunden baseret på det populære iText- og PdfBox-bibliotek.

2. Maven-afhængigheder

Lad os se på Maven-afhængighederne, som skal inkluderes i vores projekt:

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

Den seneste version af bibliotekerne kan findes her: iText og PdfBox.

En ekstra afhængighed er nødvendig for at tilføje, hvis vores fil skal krypteres. Bounty Castle Provider-pakken indeholder implementeringer af kryptografiske algoritmer og kræves af begge biblioteker:

 org.bouncycastle bcprov-jdk15on 1.56 

Den seneste version af biblioteket kan findes her: The Bounty Castle Provider.

3. Oversigt

Begge er iText og PdfBox java-biblioteker, der bruges til oprettelse / manipulation af pdf-filer. Selvom bibliotekernes endelige output er den samme, fungerer de lidt anderledes. Lad os se på dem.

4. Opret Pdf i IText

4.1. Indsæt tekst i Pdf

Lad os se på, hvordan en ny fil med "Hello World" -tekst indsættes i pdf-fil

Dokumentdokument = nyt dokument (); PdfWriter.getInstance (dokument, ny FileOutputStream ("iTextHelloWorld.pdf")); document.open (); Font font = FontFactory.getFont (FontFactory.COURIER, 16, BaseColor.BLACK); Chunk chunk = new Chunk ("Hello World", skrifttype); document.add (klump); document.close ();

Oprettelse af en pdf med brug af iText-biblioteket er baseret på manipulering af implementering af objekter Elementer interface i Dokument (i version 5.5.10 er der 45 af disse implementeringer).

Det mindste element, der kan føjes til dokumentet og bruges, kaldes Luns, som dybest set er en streng med anvendt skrifttype.

Derudover Luns'S kan kombineres med andre elementer som f.eks Stk, Afsnit osv. resulterer i pæne dokumenter.

4.2. Indsætter billede

IText-biblioteket giver en nem måde at føje et billede til dokumentet på. Vi er simpelthen nødt til at oprette en Billede eksempel og tilføj det til Dokument.

Sti sti = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); Dokumentdokument = nyt dokument (); PdfWriter.getInstance (dokument, ny FileOutputStream ("iTextImageExample.pdf")); document.open (); Image img = Image.getInstance (path.toAbsolutePath (). ToString ()); document.add (img); document.close ();

4.3. Indsættelse af tabel

Vi står muligvis over for et problem, når vi gerne vil tilføje en tabel til vores pdf. Heldigvis leverer iText sådan funktionalitet direkte.

Først skal vi skabe et PdfTable objekt og i konstruktør give et antal kolonner til vores tabel. Nu kan vi blot tilføje en ny celle ved at ringe

Nu kan vi blot tilføje en ny celle ved at ringe til addCell metode på det nyoprettede tabelobjekt. iText opretter tabelrækker, så længe alle nødvendige celler er defineret, hvad det betyder er, at når du opretter en tabel med 3 kolonner og tilføjer 8 celler til den, vises kun 2 rækker med 3 celler i hver.

Lad os se på eksemplet:

Dokumentdokument = nyt dokument (); PdfWriter.getInstance (dokument, ny FileOutputStream ("iTextTable.pdf")); document.open (); PdfPTable tabel = ny PdfPTable (3); addTableHeader (tabel); addRows (tabel); addCustomRows (tabel); document.add (tabel); document.close ();

Vi opretter en ny tabel med 3 kolonner og 3 rækker. Den første række behandler vi som en tabeloverskrift med en ændret baggrundsfarve og kantbredde:

privat ugyldigt addTableHeader (PdfPTable-tabel) {Stream.of ("kolonneoverskrift 1", "kolonneoverskrift 2", "kolonneoverskrift 3"). forEach (columnTitle -> {PdfPCell header = new PdfPCell (); header.setBackgroundColor (BaseColor .LIGHT_GRAY); header.setBorderWidth (2); header.setPhrase (ny sætning (columnTitle)); table.addCell (header);}); }

Den anden række består af tre celler, kun med tekst, ingen ekstra formatering.

private ugyldige addRows (PdfPTable-tabel) {table.addCell ("række 1, kol 1"); table.addCell ("række 1, kol 2"); table.addCell ("række 1, kol 3"); }

Vi kan ikke kun medtage tekst i celler, men også billeder. Derudover kan hver celle formateres individuelt. I nedenstående eksempel anvender vi vandrette og lodrette justeringsjusteringer:

privat ugyldig addCustomRows (PdfPTable-tabel) kaster URISyntaxException, BadElementException, IOException {Path path = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). toURI ()); Image img = Image.getInstance (path.toAbsolutePath (). ToString ()); img.scalePercent (10); PdfPCell imageCell = ny PdfPCell (img); table.addCell (imageCell); PdfPCell horizontalAlignCell = ny PdfPCell (ny sætning ("række 2, kol 2"); horizontalAlignCell.setHorizontalAlignment (Element.ALIGN_CENTER); table.addCell (vandretAlignCell); PdfPCell verticalAlignCell = ny PdfPCell (ny sætning ("række 2, kol 3")); verticalAlignCell.setVerticalAlignment (Element.ALIGN_BOTTOM); table.addCell (verticalAlignCell); }

4.4. Filkryptering

For at anvende tilladelse ved hjælp af iText-biblioteket skal vi allerede have oprettet pdf-dokument. I vores eksempel vil vi bruge vores iTextHelloWorld.pdf fil genereret tidligere.

Når vi indlæser filen ved hjælp af PdfReader, skal vi oprette en PdfStamper som bruges til at anvende yderligere indhold til filer som metadata, kryptering osv:

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

I vores eksempel krypterede vi filen med to adgangskoder. Brugeradgangskoden (“brugerpas”), hvor en bruger kun har skrivebeskyttelsesret uden mulighed for at udskrive det, og ejeradgangskode (“ejerpass”), der bruges som hovednøgle, der giver en person fuld adgang til pdf.

Hvis vi vil tillade brugeren at udskrive pdf i stedet for 0 (tredje parameter for setEncryption) vi kan passere:

PdfWriter.ALLOW_PRINTING

Selvfølgelig kan vi blande forskellige tilladelser som:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Husk, at ved hjælp af iText til at indstille adgangstilladelser opretter vi også en midlertidig pdf, der skal slettes, og hvis ikke, kan den være fuldt tilgængelig for nogen.

5. Opret Pdf i PdfBox

5.1. Indsæt tekst i Pdf

Som modsat af iText, det PdfBox bibliotek leverer API, som er baseret på strømmanipulation. Der er ingen klasser som Luns/Afsnit osv PDDocument klasse er en in-memory Pdf-repræsentation, hvor brugeren skriver data ved at manipulere PDPageContentStream klasse.

Lad os se på kodeeksemplet:

PDDocument-dokument = nyt PDDocument (); PDPage side = ny PDPage (); document.addPage (side); PDPageContentStream contentStream = ny PDPageContentStream (dokument, side); contentStream.setFont (PDType1Font.COURIER, 12); contentStream.beginText (); contentStream.showText ("Hello World"); contentStream.endText (); contentStream.close (); document.save ("pdfBoxHelloWorld.pdf"); document.close ();

5.2. Indsætter billede

At indsætte billeder er ligetil.

Først skal vi indlæse en fil og oprette en PDImageXObject, træk det derefter på dokumentet (skal angive nøjagtige x-, y-koordinater).

Det er alt:

PDDocument-dokument = nyt PDDocument (); PDPage-side = ny PDPage (); document.addPage (side); Sti sti = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); PDPageContentStream contentStream = ny PDPageContentStream (dokument, side); PDImageXObject image = PDImageXObject.createFromFile (path.toAbsolutePath (). ToString (), dokument); contentStream.drawImage (billede, 0, 0); contentStream.close (); document.save ("pdfBoxImage.pdf"); document.close (); 

5.3. Indsættelse af en tabel

Desværre, PdfBox giver ikke nogen out-of-box-metoder, der tillader oprettelse af tabeller. Hvad vi kan gøre i en sådan situation er at tegne det manuelt - bogstaveligt talt tegne hver linje, indtil vores tegning ligner vores drømte bord.

5.4. Filkryptering

PdfBox bibliotek giver mulighed for at kryptere og justere filtilladelse for brugeren. Sammenligner med iText, det kræver ikke at bruge en allerede eksisterende fil, som vi simpelthen bruger PDDocument. Pdf-filtilladelser håndteres af AccessPermission klasse, hvor vi kan indstille, om en bruger vil være i stand til at ændre, udtrække indhold eller udskrive en fil.

Efterfølgende opretter vi en StandardBeskyttelsePolitik objekt, der tilføjer adgangskodebaseret beskyttelse til dokumentet. Vi kan angive to typer adgangskoder. Brugeradgangskoden, hvorefter personen kan åbne en fil med anvendt adgangstilladelse og ejeradgangskode (ingen begrænsninger i filen):

PDDocument-dokument = nyt PDDocument (); PDPage-side = ny PDPage (); document.addPage (side); AccessPermission accessPermission = ny AccessPermission (); accessPermission.setCanPrint (false); accessPermission.setCanModify (falsk); StandardProtectionPolicy standardProtectionPolicy = ny StandardProtectionPolicy ("ejerpass", "brugerpass", accessPermission); document.protect (standardProtectionPolicy); document.save ("pdfBoxEncryption.pdf"); document.close (); 

Vores eksempel præsenterer en situation, at hvis en bruger giver brugeradgangskode, kan filen ikke ændres og udskrives.

6. Konklusioner

I denne vejledning diskuterede vi måder at oprette en pdf-fil på to populære Java-biblioteker.

Fuldstændige eksempler kan findes i det Maven-baserede projekt på GitHub.