Opprette PDF-filer i Java

1. Introduksjon

I denne raske artikkelen vil vi fokusere på å lage PDF-dokument fra bunnen av basert på det populære iText- og PdfBox-biblioteket.

2. Maven-avhengigheter

La oss ta en titt på Maven-avhengighetene, som må inkluderes i prosjektet vårt:

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

Den siste versjonen av bibliotekene finner du her: iText og PdfBox.

Én ekstra avhengighet er nødvendig å legge til, i tilfelle filen vår må krypteres. Bounty Castle Provider-pakken inneholder implementeringer av kryptografiske algoritmer og kreves av begge biblioteker:

 org.bouncycastle bcprov-jdk15on 1.56 

Den siste versjonen av biblioteket finner du her: The Bounty Castle Provider.

3. Oversikt

Begge er iText og PdfBox java-biblioteker som brukes til å lage / manipulere pdf-filer. Selv om den endelige produksjonen fra bibliotekene er den samme, fungerer de på en litt annen måte. La oss ta en titt på dem.

4. Lag Pdf i IText

4.1. Sett inn tekst i Pdf

La oss se på hvordan en ny fil med "Hello World" -tekst settes inn i pdf-fil

Dokumentdokument = nytt 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", font); document.add (klump); document.close ();

Å lage en pdf med bruk av iText-biblioteket er basert på å manipulere implementering av objekter Elementer grensesnitt i Dokument (i versjon 5.5.10 er det 45 av disse implementeringene).

Det minste elementet som kan legges til dokumentet og brukes kalles Klump, som i utgangspunktet er en streng med anvendt skrift.

I tillegg Klump‘S kan kombineres med andre elementer som Avsnitt, Seksjon etc. resulterer i flotte dokumenter.

4.2. Setter inn bilde

IText-biblioteket gir en enkel måte å legge til et bilde i dokumentet. Vi trenger rett og slett å lage en Bilde forekomst og legg den til Dokument.

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

4.3. Sette inn tabell

Vi kan møte et problem når vi ønsker å legge til en tabell i pdf-en. Heldigvis gir iText slik funksjonalitet utenom boksen.

Først må vi lage en PdfTable objekt og i konstruktør gi et antall kolonner for bordet vårt. Nå kan vi bare legge til ny celle ved å ringe

Nå kan vi bare legge til ny celle ved å ringe addCell metode på det nyopprettede bordobjektet. iText vil opprette tabellrader så lenge alle nødvendige celler er definert. Hva det betyr er at når du oppretter en tabell med 3 kolonner og legger til 8 celler i den, vises bare 2 rader med 3 celler i hver.

La oss ta en titt på eksemplet:

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

Vi oppretter en ny tabell med 3 kolonner og 3 rader. Den første raden skal vi behandle som en tabellhode med endret bakgrunnsfarge og kantbredde:

privat tomrom addTableHeader (PdfPTable tabell) {Stream.of ("kolonneoverskrift 1", "kolonneoverskrift 2", "kolonneoverskrift 3"). forEach (columnTitle -> {PdfPCell topptekst = ny PdfPCell (); header.setBackgroundColor (BaseColor .LIGHT_GRAY); header.setBorderWidth (2); header.setPhrase (ny setning (columnTitle)); table.addCell (header);}); }

Den andre raden vil være sammensatt av tre celler bare med tekst, ingen ekstra formatering.

private void addRows (PdfPTable tabell) {table.addCell ("rad 1, kol 1"); table.addCell ("rad 1, kol 2"); table.addCell ("rad 1, kol 3"); }

Vi kan ikke bare inkludere tekst i celler, men også bilder. I tillegg kan hver celle formateres individuelt. I eksemplet som presenteres nedenfor bruker vi horisontale og vertikale justeringsjusteringer:

privat tomrom addCustomRows (PdfPTable-tabell) 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 setning ("rad 2, kol 2"); horizontalAlignCell.setHorizontalAlignment (Element.ALIGN_CENTER); table.addCell (horizontalAlignCell); PdfPCell verticalAlignCell = ny PdfPCell (ny setning ("rad 2, kol 3")); verticalAlignCell.setVerticalAlignment (Element.ALIGN_BOTTOM); table.addCell (verticalAlignCell); }

4.4. Filkryptering

For å bruke tillatelse ved bruk av iText-biblioteket, må vi allerede ha opprettet pdf-dokument. I vårt eksempel vil vi bruke vår iTextHelloWorld.pdf fil generert tidligere.

Når vi laster inn filen ved hjelp av PdfReader, må vi lage en PdfStamper som brukes til å bruke ekstra innhold 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 vårt eksempel krypterte vi filen med to passord. Brukerpassordet (“brukerpass”) der en bruker bare har skrivebeskyttet rett uten mulighet til å skrive det ut, og eierpassord (“eierpass”) som brukes som hovednøkkel som gir en person full tilgang til pdf.

Hvis vi vil la brukeren skrive ut pdf, i stedet for 0 (tredje parameter for setEncryption) vi kan passere:

PdfWriter.ALLOW_PRINTING

Selvfølgelig kan vi blande forskjellige tillatelser som:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Husk at ved å bruke iText til å angi tilgangstillatelser, lager vi også en midlertidig pdf som skal slettes, og hvis ikke, kan den være fullstendig tilgjengelig for noen.

5. Lag Pdf i PdfBox

5.1. Sett inn tekst i Pdf

Som motsatt av iText, den PdfBox biblioteket gir API som er basert på strømmanipulering. Det er ingen klasser som Klump/Avsnitt osv PDDocument klasse er en PDF-representasjon i minnet der brukeren skriver data ved å manipulere PDPageContentStream klasse.

La oss ta en titt på kodeeksemplet:

PDDocument document = nytt 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. Setter inn bilde

Det er greit å sette inn bilder.

Først må vi laste inn en fil og opprette en PDImageXObject, tegne den deretter på dokumentet (må oppgi nøyaktige x, y-koordinater).

Det er alt:

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

5.3. Sette inn en tabell

Dessverre, PdfBox gir ikke noen out-of-box-metoder som tillater å lage tabeller. Det vi kan gjøre i en slik situasjon er å tegne den manuelt - bokstavelig talt, tegne hver linje til tegningen vår ligner vårt drømte bord.

5.4. Filkryptering

PdfBox biblioteket gir en mulighet til å kryptere, og justere filtillatelse for brukeren. Sammenlignet med iText, det krever ikke å bruke en allerede eksisterende fil, slik vi bare bruker PDDocument. Pdf-filtillatelser håndteres av AccessPermission klasse, hvor vi kan angi om en bruker skal kunne endre, trekke ut innhold eller skrive ut en fil.

Deretter oppretter vi en StandardBeskyttelsePolitikk objekt som gir dokumentet passordbasert beskyttelse. Vi kan spesifisere to typer passord. Brukerpassordet, hvoretter personen vil kunne åpne en fil med anvendte tilgangstillatelser og eierpassord (ingen begrensninger på filen):

PDDocument document = nytt PDDocument (); PDPage-side = ny PDPage (); document.addPage (side); AccessPermission accessPermission = ny AccessPermission (); accessPermission.setCanPrint (false); accessPermission.setCanModify (false); StandardProtectionPolicy standardProtectionPolicy = ny StandardProtectionPolicy ("eierpass", "brukerpass", accessPermission); document.protect (standardProtectionPolicy); document.save ("pdfBoxEncryption.pdf"); document.close (); 

Eksemplet vårt presenterer en situasjon at hvis en bruker oppgir brukerpassord, kan ikke filen endres og skrives ut.

6. Konklusjoner

I denne veiledningen diskuterte vi måter å lage en pdf-fil i to populære Java-biblioteker.

Fullstendige eksempler finnes i det Maven-baserte prosjektet på GitHub.


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