Skabelse af PDF-filer i Java

Indledning

I denne hurtige artikel vil vi fokusere på at skabe PDF-dokumenter fra bunden baseret på det populære iText- og PdfBox-bibliotek.

Maven-afhængigheder

Lad os tage et kig på de Maven-afhængigheder, som skal indgå i vores projekt:

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

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

<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>

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

Overblik

Både, iText og PdfBox er java-biblioteker, der bruges til oprettelse/manipulation af pdf-filer. Selv om det endelige output af bibliotekerne er det samme, fungerer de på en lidt forskellig måde. Lad os tage et kig på dem.

Skab 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

Skabelse af en pdf med brug af iText-biblioteket er baseret på at manipulere objekter, der implementerer Elements interface i Document (i version 5.5.10 er der 45 af disse implementeringer).

Det mindste element, der kan tilføjes til dokumentet og anvendes, kaldes Chunk, som grundlæggende er en streng med anvendt skrifttype.

Dertil kommer, at Chunk’s kan kombineres med andre elementer som Paragraphs, Section osv. hvilket resulterer i flot udseende dokumenter.

4.2. Indsættelse af billede

iText-biblioteket giver en nem måde at tilføje et billede til dokumentet på. Vi skal blot oprette en Image-instans og tilføje den til dokumentet.

4.3. Indsættelse af tabel

Vi kan stå over for et problem, når vi gerne vil tilføje en tabel til vores pdf-fil. Heldigvis giver iText out-of-the-box en sådan funktionalitet.

Det første, vi skal gøre, er at oprette et PdfTable-objekt og i konstruktøren give et antal kolonner til vores tabel. Nu kan vi simpelthen tilføje en ny celle ved at kalde

Nu kan vi simpelthen tilføje en ny celle ved at kalde addCell-metoden på det nyligt oprettede tabelobjekt. iText vil oprette tabelrækker, så længe alle nødvendige celler er defineret, det betyder, at når du opretter en tabel med 3 kolonner og tilføjer 8 celler til den, vil kun 2 rækker med 3 celler i hver blive vist.

Lad os tage et kig på eksemplet:

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:

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

private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}

Vi kan ikke kun inkludere tekst i cellerne, men også billeder. Derudover kan hver celle formateres individuelt, i eksemplet nedenfor anvender vi justeringer af den vandrette og lodrette tilpasning:

4.4. Filkryptering

For at kunne anvende tilladelse ved hjælp af iText-biblioteket skal vi allerede have oprettet et pdf-dokument. I vores eksempel vil vi bruge vores iTextHelloWorld.pdf-fil, der er 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 filen som metadata, kryptering osv:

I vores eksempel har vi krypteret filen med to adgangskoder. Brugeradgangskoden (“userpass”), hvor en bruger kun har skrivebeskyttet rettighed uden mulighed for at udskrive den, og ejeradgangskoden (“ownerpass”), der bruges som hovednøgle, der giver en person fuld adgang til pdf-filen.

Hvis vi ønsker at tillade brugeren at udskrive pdf’en, kan vi i stedet for 0 (tredje parameter i setEncryption) videregive:

PdfWriter.ALLOW_PRINTING

Selvfølgelig kan vi blande forskellige tilladelser som:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Husk på, at vi ved at bruge iText til at indstille adgangstilladelser også opretter en midlertidig pdf, som skal slettes, og hvis ikke den kan være fuldt tilgængelig for hvem som helst.

Skab Pdf i PdfBox

5.1. Indsæt tekst i Pdf

I modsætning til iText tilbyder PdfBox-biblioteket en API, som er baseret på stream-manipulation. Der er ingen klasser som Chunk/Paragraph osv. PDDocument-klassen er en Pdf-repræsentation i hukommelsen, hvor brugeren skriver data ved at manipulere PDPageContentStream-klassen.

Lad os tage et kig på kodeeksemplet:

5.2. Indsættelse af billede

Indsættelse af billeder er ligetil.

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

Det er alt:

5.3. Indsættelse af en tabel

Der er desværre ikke nogen out-of-box-metoder i PdfBox, der gør det muligt at oprette tabeller. Det, 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ømmestabel.

5.4. Filkryptering

PdfBox-biblioteket giver mulighed for at kryptere, og justere filtilladelse for brugeren. Sammenlignet med iText, kræver det ikke at bruge en allerede eksisterende fil, da vi blot bruger PDDocument. Pdf-filtilladelser håndteres af AccessPermission-klassen, hvor vi kan indstille, om en bruger vil kunne ændre, udtrække indhold eller udskrive en fil.

Derpå opretter vi et StandardProtectionPolicy-objekt, som tilføjer password-baseret beskyttelse til dokumentet. Vi kan angive to typer adgangskode. Brugeradgangskoden, hvorefter en person vil kunne åbne en fil med anvendte adgangstilladelser og ejeradgangskoden (ingen begrænsninger for filen):

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

Konklusioner

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

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

Kom godt i gang med Spring 5 og Spring Boot 2 gennem kurset Lær Spring:

>> CHECK OUT THE COURSE

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.