Inleiding
In dit korte artikel, zullen we ons richten op het maken van PDF documenten vanuit het niets, gebaseerd op de populaire iText en PdfBox library.
Maven-afhankelijkheden
Laten we eens kijken naar de Maven-afhankelijkheden die in ons project moeten worden opgenomen:
De nieuwste versie van de bibliotheken kan hier worden gevonden: iText en PdfBox.
Een extra afhankelijkheid is noodzakelijk om toe te voegen, voor het geval ons bestand moet worden gecodeerd. Het Bounty Castle Provider pakket bevat implementaties van cryptografische algoritmen en is vereist door beide bibliotheken:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>
De laatste versie van de bibliotheek kan hier gevonden worden: The Bounty Castle Provider.
Overzicht
Beiden, de iText en PdfBox zijn java bibliotheken die gebruikt worden voor het maken/manipuleren van pdf bestanden. Hoewel de uiteindelijke uitvoer van de bibliotheken hetzelfde is, werken ze op een iets andere manier. Laten we ze eens bekijken.
Pdf maken in IText
4.1. Insert Text in Pdf
Laten we eens kijken, naar de manier waarop een nieuw bestand met “Hello World” tekst in pdf bestand wordt ingevoegd
Het maken van een pdf met behulp van de iText bibliotheek is gebaseerd op het manipuleren van objecten die de Elements interface in Document implementeren (in versie 5.5.10 zijn er 45 van die implementaties).
Het kleinste element dat aan het document kan worden toegevoegd en gebruikt heet Chunk, wat in feite een string is met een toegepast lettertype.
Extra kunnen Chunk’s worden gecombineerd met andere elementen zoals Paragraphs, Section etc. wat resulteert in mooi ogende documenten.
4.2. Afbeelding invoegen
De iText bibliotheek biedt een eenvoudige manier om een afbeelding aan het document toe te voegen. We hoeven alleen maar een beeldinstantie te maken en die aan het document toe te voegen.
4.3. Tabel invoegen
We kunnen voor een probleem komen te staan wanneer we een tabel aan onze pdf willen toevoegen. Gelukkig biedt iText een dergelijke functionaliteit out-of-the-box.
Eerst moeten we een PdfTable-object maken en in de constructor een aantal kolommen voor onze tabel opgeven. Nu kunnen we eenvoudig een nieuwe cel toevoegen door
de addCell methode op het nieuw aangemaakte tabel object op te roepen. iText zal tabel rijen maken zolang alle benodigde cellen gedefinieerd zijn, wat het betekent is dat zodra u een tabel met 3 kolommen maakt en er 8 cellen aan toevoegt, er slechts 2 rijen met 3 cellen in elk zullen worden weergegeven.
Laten we eens kijken naar het voorbeeld:
We maken een nieuwe tabel met 3 kolommen en 3 rijen. De eerste rij zullen we behandelen als een tabel header met een gewijzigde achtergrond kleur en rand breedte:
De tweede rij zal worden samengesteld uit drie cellen alleen met tekst, geen extra opmaak.
private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}
We kunnen niet alleen tekst in cellen, maar ook afbeeldingen. Bovendien kan elke cel afzonderlijk worden geformatteerd, in het onderstaande voorbeeld passen we horizontale en verticale uitlijningsaanpassingen toe:
4.4. Bestand Encryptie
Om toestemming met iText bibliotheek te kunnen toepassen, moeten we al een pdf document hebben gemaakt. In ons voorbeeld gebruiken we het eerder gegenereerde bestand iTextHelloWorld.pdf.
Als we het bestand eenmaal met PdfReader hebben geladen, moeten we een PdfStamper maken die wordt gebruikt om extra inhoud aan het bestand toe te voegen, zoals metadata, encryptie etc:
In ons voorbeeld hebben we het bestand met twee wachtwoorden gecodeerd. Het gebruikerswachtwoord (“userpass”) waarbij een gebruiker alleen leesrechten heeft zonder de mogelijkheid om het af te drukken, en het eigenaarswachtwoord (“ownerpass”) dat wordt gebruikt als hoofdsleutel waarmee een persoon volledige toegang heeft tot pdf.
Als we de gebruiker willen toestaan de pdf af te drukken, kunnen we in plaats van 0 (derde parameter van setEncryption) doorgeven:
PdfWriter.ALLOW_PRINTING
Natuurlijk kunnen we verschillende rechten combineren, zoals:
PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY
Bedenk wel dat we met iText om de toegangsrechten in te stellen, ook een tijdelijke pdf maken die verwijderd moet worden en anders voor iedereen volledig toegankelijk kan zijn.
Pdf maken in PdfBox
5.1. Tekst invoegen in Pdf
In tegenstelling tot iText biedt de PdfBox-bibliotheek een API die is gebaseerd op stream-manipulatie. Er zijn geen klassen zoals Chunk/Paragraph enz. De PDDocument klasse is een in-memory Pdf representatie waar de gebruiker gegevens schrijft door de PDPageContentStream klasse te manipuleren.
Laten we eens kijken naar het code voorbeeld:
5.2. Afbeeldingen invoegen
Het invoegen van afbeeldingen is eenvoudig.
Eerst moeten we een bestand laden en een PDImageXObject maken, om het vervolgens op het document te tekenen (exacte x,y-coördinaten opgeven).
Dat is alles:
5.3. Een tabel invoegen
Ter spijt biedt PdfBox geen out-of-box methoden om tabellen te maken. Wat we in zo’n situatie kunnen doen is het handmatig tekenen – letterlijk, elke lijn tekenen totdat onze tekening lijkt op onze gedroomde tabel.
5.4. Bestand Encryptie
PdfBox bibliotheek biedt de mogelijkheid om bestanden te encrypten, en de toestemming van de gebruiker aan te passen. In vergelijking met iText is het niet nodig om een reeds bestaand bestand te gebruiken, omdat we gewoon PDDocument gebruiken. Pdf-bestandspermissies worden afgehandeld door de AccessPermission klasse, waarin we kunnen instellen of een gebruiker een bestand mag wijzigen, extraheren of printen.
Daarna maken we een StandardProtectionPolicy object aan, dat wachtwoord-gebaseerde beveiliging aan het document toevoegt. Wij kunnen twee soorten wachtwoorden specificeren. Het gebruikerswachtwoord, waarna iemand een bestand kan openen met toegepaste toegangsrechten en het eigenaarswachtwoord (geen beperkingen voor het bestand):
In ons voorbeeld wordt een situatie geschetst waarin, als een gebruiker een gebruikerswachtwoord opgeeft, het bestand niet kan worden gewijzigd en afgedrukt.
Conclusies
In deze tutorial hebben we manieren besproken om een pdf-bestand te maken in twee populaire Java-bibliotheken.
De volledige voorbeelden zijn te vinden in het op Maven gebaseerde project op GitHub.
Ga aan de slag met Spring 5 en Spring Boot 2, via de cursus Leer Spring:
>> CHECK OUT THE COURSE