Skapa PDF-filer i Java

Introduktion

I den här artikeln fokuserar vi på att skapa PDF-dokument från grunden med hjälp av de populära biblioteken iText och PdfBox.

Maven-beroenden

Låt oss ta en titt på Maven-beroendena, som måste inkluderas i vårt projekt:

Den senaste versionen av biblioteken kan hittas här: iText and PdfBox.

Ett extra beroende är nödvändigt att lägga till, ifall vår fil kommer att behöva vara krypterad. Paketet Bounty Castle Provider innehåller implementeringar av kryptografiska algoritmer och krävs av båda biblioteken:

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

Den senaste versionen av biblioteket finns här: Bounty Castle Provider.

Översikt

Både iText och PdfBox är java-bibliotek som används för att skapa/manipulera pdf-filer. Även om slutresultatet för biblioteken är detsamma fungerar de på lite olika sätt. Låt oss ta en titt på dem.

Skapa Pdf i IText

4.1. Infoga text i Pdf

Låt oss ta en titt på hur en ny fil med ”Hello World”-text infogas i pdf-filen

Skapa en pdf med hjälp av iText-biblioteket bygger på att man manipulerar objekt som implementerar gränssnittet Elements i Document (i version 5.5.10 finns det 45 av dessa implementeringar).

Det minsta elementet som kan läggas till i dokumentet och användas kallas Chunk, vilket i princip är en sträng med tillämpat typsnitt.

Och Chunk’s kan kombineras med andra element som Paragraphs, Section etc. vilket resulterar i snygga dokument.

4.2. Infoga bild

I iText-biblioteket finns ett enkelt sätt att lägga till en bild i dokumentet. Vi behöver bara skapa en bildinstans och lägga till den i dokumentet.

4.3. Infoga tabell

Vi kan stöta på ett problem när vi vill lägga till en tabell i vår pdf. Som tur är erbjuder iText en sådan funktionalitet direkt ur lådan.

Det första vi behöver göra är att skapa ett PdfTable-objekt och i konstruktören tillhandahålla ett antal kolumner för vår tabell. Nu kan vi helt enkelt lägga till en ny cell genom att ringa

Nu kan vi helt enkelt lägga till en ny cell genom att ringa addCell-metoden på det nyskapade tabellobjektet. iText kommer att skapa tabellrader så länge som alla nödvändiga celler är definierade, vilket innebär att när du skapar en tabell med 3 kolumner och lägger till 8 celler till den, så kommer endast 2 rader med 3 celler i vardera att visas.

Låtsas ta en titt på exemplet:

Vi skapar en ny tabell med 3 kolumner och 3 rader. Den första raden behandlar vi som en tabellrubrik med ändrad bakgrundsfärg och kantbredd:

Den andra raden kommer att bestå av tre celler bara med text, ingen extra 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 inkludera inte bara text i cellerna utan även bilder. Dessutom kan varje cell formateras individuellt, i exemplet nedan tillämpar vi horisontell och vertikal justering:

4.4. Filkryptering

För att kunna tillämpa behörighet med hjälp av iText-biblioteket måste vi ha ett redan skapat pdf-dokument. I vårt exempel kommer vi att använda vår iTextHelloWorld.pdf-fil som genererats tidigare.

När vi laddar filen med hjälp av PdfReader måste vi skapa en PdfStamper som används för att applicera ytterligare innehåll till filen som metadata, kryptering etc:

I vårt exempel har vi krypterat filen med två lösenord. Användarlösenordet (”userpass”) där en användare endast har läs- och skrivrättigheter utan möjlighet att skriva ut den, och ägarlösenordet (”ownerpass”) som används som huvudnyckel som tillåter en person att ha full tillgång till pdf-filen.

Om vi vill tillåta användaren att skriva ut pdf:n kan vi i stället för 0 (tredje parametern i setEncryption) skicka:

PdfWriter.ALLOW_PRINTING

Självklart kan vi blanda olika behörigheter som:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Håll i åtanke att om vi använder iText för att ställa in åtkomsträttigheter så skapar vi också en tillfällig pdf:n som bör raderas, och om inte så skulle den kunna vara fullt tillgänglig för vem som helst.

Skapa Pdf i PdfBox

5.1. Infoga text i Pdf

I motsats till iText erbjuder PdfBox-biblioteket ett API som bygger på strömmanipulation. Det finns inga klasser som Chunk/Paragraph etc. PDDocument-klassen är en Pdf-representation i minnet där användaren skriver data genom att manipulera PDPageContentStream-klassen.

Låt oss ta en titt på kodexemplet:

5.2. Infoga bild

Insättning av bilder är enkelt.

Först måste vi läsa in en fil och skapa ett PDImageXObject, därefter rita den på dokumentet (du måste ange exakta x,y-koordinater).

Det var allt:

5.3. Infoga en tabell

Tyvärr tillhandahåller PdfBox inga out-of-box-metoder som gör det möjligt att skapa tabeller. Vad vi kan göra i en sådan situation är att rita den manuellt – bokstavligen, rita varje linje tills vår ritning liknar vår drömtabell.

5.4. Filkryptering

PdfBox-biblioteket erbjuder en möjlighet att kryptera och justera filbehörighet för användaren. Jämfört med iText kräver det inte att man använder en redan existerande fil, eftersom vi helt enkelt använder PDDocument. Pdf-filbehörigheter hanteras av klassen AccessPermission, där vi kan ställa in om en användare ska kunna ändra, extrahera innehåll eller skriva ut en fil.

Därefter skapar vi ett StandardProtectionPolicy-objekt som lägger till ett lösenordsbaserat skydd till dokumentet. Vi kan ange två typer av lösenord. Användarlösenordet, varefter personen kommer att kunna öppna en fil med tillämpade åtkomstbehörigheter och ägarlösenordet (inga begränsningar för filen):

Vårt exempel presenterar en situation som innebär att om en användare anger användarlösenord kan filen inte ändras och skrivas ut.

Slutsatser

I den här handledningen diskuterade vi sätt att skapa en pdf-fil i två populära Java-bibliotek.

Fullständiga exempel finns i det Maven-baserade projektet på GitHub.

Kom igång med Spring 5 och Spring Boot 2 genom kursen Lär dig Spring:

>> CHECK OUT THE COURSE

Lämna ett svar

Din e-postadress kommer inte publiceras.