PDF-conversies in Java

1. Inleiding

In dit korte artikel zullen we ons concentreren op programmatisch doen conversie tussen PDF-bestanden en andere formaten in Java.

Meer specifiek zullen we beschrijven hoe u PDF's kunt opslaan als afbeeldingsbestanden, zoals PNG of JPEG, PDF's naar Microsoft Word-documenten kunt converteren, exporteren als HTML en de teksten kunt extraheren met behulp van meerdere open-source Java-bibliotheken.

2. Maven afhankelijkheden

De eerste bibliotheek die we zullen bekijken is Pdf2Dom. Laten we beginnen met de Maven-afhankelijkheden die we aan ons project moeten toevoegen:

 org.apache.pdfbox pdfbox-tools 2.0.3 net.sf.cssbox pdf2dom 1.6 

We gaan de eerste afhankelijkheid gebruiken om het geselecteerde PDF-bestand te laden. De tweede afhankelijkheid is verantwoordelijk voor de conversie zelf. De laatste versies zijn hier te vinden: pdfbox-tools en pdf2dom.

Bovendien gebruiken we iText om de tekst uit een pdf-bestand te halen en POI om het.docx document.

Laten we eens kijken naar de Maven-afhankelijkheden die we in ons project moeten opnemen:

 com.itextpdf itextpdf 5.5.10 com.itextpdf.tool xmlworker 5.5.10 org.apache.poi poi-ooxml 3.15 org.apache.poi poi-kladblok 3.15 

De nieuwste versie van iText is hier te vinden en je kunt hier naar Apache POI zoeken.

3. PDF- en HTML-conversies

Om met HTML-bestanden te werken, gebruiken we Pdf2Dom - een PDF-parser die de documenten converteert naar een HTML DOM-weergave. De verkregen DOM-structuur kan vervolgens worden geserialiseerd naar een HTML-bestand of verder worden verwerkt.

Om PDF naar HTML te converteren, hebben we XMLWorker nodig, de bibliotheek die wordt geleverd door iText.

3.1. PDF naar HTML

Laten we eens kijken naar een eenvoudige conversie van pdf naar html:

private void generationHTMLFromPDF (String bestandsnaam) {PDDocument pdf = PDDocument.load (nieuw bestand (bestandsnaam)); Writer output = nieuwe PrintWriter ("src / output / pdf.html", "utf-8"); nieuwe PDFDomTree (). writeText (pdf, output); output.close (); } 

In het bovenstaande codefragment laden we het PDF-bestand met behulp van de laad-API van PDFBox. Als de PDF is geladen, gebruiken we de parser om het bestand te ontleden en naar de uitvoer te schrijven die is gespecificeerd door java.io.Writer.

Let daar op het converteren van PDF naar HTML is nooit een 100%, pixel-naar-pixel resultaat. De resultaten zijn afhankelijk van de complexiteit en de structuur van het specifieke PDF-bestand.

3.2. HTML naar PDF

Laten we nu eens kijken naar de conversie van HTML naar PDF:

privé statische leegte genererenPDFFromHTML (String bestandsnaam) {Document document = nieuw document (); PdfWriter-schrijver = PdfWriter.getInstance (document, nieuwe FileOutputStream ("src / output / html.pdf")); document.open (); XMLWorkerHelper.getInstance (). ParseXHtml (schrijver, document, nieuwe FileInputStream (bestandsnaam)); document.close (); }

Let daar op bij het converteren van HTML naar PDF, moet u ervoor zorgen dat HTML alle tags correct heeft gestart en gesloten, anders wordt de PDF niet gemaakt. Het positieve aspect van deze benadering is dat de PDF precies hetzelfde wordt gemaakt als in het HTML-bestand.

4. Conversies van PDF naar afbeelding

Er zijn veel manieren om PDF-bestanden naar een afbeelding te converteren. Een van de meest populaire oplossingen is genoemd Apache PDFBox. Deze bibliotheek is een open source Java-tool voor het werken met PDF-documenten. Voor conversie van afbeelding naar PDF gebruiken we iText opnieuw.

4.1. PDF naar afbeelding

Om te beginnen met het converteren van PDF's naar afbeeldingen, moeten we de afhankelijkheid gebruiken die in de vorige sectie wordt genoemd - pdfbox-tools.

Laten we het codevoorbeeld eens bekijken:

private void generationImageFromPDF (String bestandsnaam, String extensie) {PDDocument document = PDDocument.load (nieuw bestand (bestandsnaam)); PDFRenderer pdfRenderer = nieuwe PDFRenderer (document); voor (int pagina = 0; pagina <document.getNumberOfPages (); ++ pagina) {BufferedImage bim = pdfRenderer.renderImageWithDPI (pagina, 300, ImageType.RGB); ImageIOUtil.writeImage (bim, String.format ("src / output / pdf-% d.% S", pagina + 1, extensie), 300); } document.close (); }

Er zijn enkele belangrijke onderdelen in de bovengenoemde code. We moeten gebruiken PDFRenderer, om PDF als een BufferedImage. Ook moet elke pagina van het pdf-bestand afzonderlijk worden weergegeven.

Ten slotte gebruiken we ImageIOUtil, van Apache PDFBox Tools, om een ​​afbeelding te schrijven, met de extensie die we specificeren. Mogelijke bestandsformaten zijn jpeg, jpg, gif, tiff of png.

Merk op dat Apache PDFBox een geavanceerd hulpmiddel is - we kunnen onze eigen PDF-bestanden vanaf het begin maken, formulieren invullen in een PDF-bestand, het PDF-bestand ondertekenen en / of coderen.

4.2. Afbeelding naar PDF

Laten we het codevoorbeeld eens bekijken:

private statische ongeldig genererenPDFFromImage (String bestandsnaam, String extensie) {Document document = nieuw document (); String input = bestandsnaam + "." + extensie; String output = "src / output /" + extensie + ".pdf"; FileOutputStream fos = nieuwe FileOutputStream (output); PdfWriter-schrijver = PdfWriter.getInstance (document, fos); writer.open (); document.open (); document.add (Image.getInstance ((nieuwe URL (invoer)))); document.close (); schrijver.close (); }

Houd er rekening mee dat we een afbeelding als bestand kunnen leveren, of deze kunnen laden vanaf een URL, zoals weergegeven in het bovenstaande voorbeeld. Bovendien zijn de extensies van het outputbestand die we kunnen gebruiken jpeg, jpg, gif, tiff of png.

5. PDF-naar-tekstconversies

Om de onbewerkte tekst uit een pdf-bestand te extraheren, gebruiken we ook Apache PDFBox opnieuw. Voor conversie van tekst naar PDF gaan we gebruiken iText.

5.1. PDF naar tekst

We hebben een methode gemaakt met de naam genererenTxtFromPDF (…) en verdeelde hetin drie hoofdonderdelen: laden van het PDF-bestand, extractie van tekst en uiteindelijke bestandscreatie.

Laten we beginnen met het laden van een onderdeel:

Bestand f = nieuw bestand (bestandsnaam); String parsedText; PDFParser-parser = nieuwe PDFParser (nieuwe RandomAccessFile (f, "r")); parser.parse ();

Om een ​​pdf-bestand te kunnen lezen, gebruiken we PDFParser, met een "r" (lezen) optie. Bovendien moeten we de parser.parse () methode die ervoor zorgt dat de PDF wordt geparseerd als een stream en wordt gevuld in het COSDocument voorwerp.

Laten we eens kijken naar het uitpakkende tekstgedeelte:

COSDocument cosDoc = parser.getDocument (); PDFTextStripper pdfStripper = nieuwe PDFTextStripper (); PDDocument pdDoc = nieuw PDDocument (cosDoc); parsedText = pdfStripper.getText (pdDoc);

In de eerste regel zullen we besparen COSDocument binnen in de cosDoc variabele. Het zal dan worden gebruikt om te construeren PDocument, de weergave in het geheugen van het PDF-document. Ten slotte zullen we gebruiken PDFTextStripper om de ruwe tekst van een document te retourneren. Na al die operaties moeten we gebruiken dichtbij() methode om alle gebruikte streams te sluiten.

In het laatste deel zullen we tekst opslaan in het nieuw gemaakte bestand met behulp van eenvoudige Java PrintWriter:

PrintWriter pw = nieuwe PrintWriter ("src / output / pdf.txt"); pw.print (parsedText); pw.close ();

Houd er rekening mee dat u de opmaak in een gewoon tekstbestand niet kunt behouden omdat het alleen tekst bevat.

5.2. Tekst naar pdf

Het omzetten van tekstbestanden naar PDF is een beetje lastig. Om de bestandsopmaak te behouden, moet u aanvullende regels toepassen.

In het volgende voorbeeld houden we geen rekening met de opmaak van het bestand.

Eerst moeten we de grootte van het PDF-bestand, de versie en het uitvoerbestand definiëren. Laten we eens kijken naar het codevoorbeeld:

Document pdfDoc = nieuw document (PageSize.A4); PdfWriter.getInstance (pdfDoc, nieuwe FileOutputStream ("src / output / txt.pdf")) .setPdfVersion (PdfWriter.PDF_VERSION_1_7); pdfDoc.open ();

In de volgende stap zullen we het lettertype definiëren en ook het commando dat wordt gebruikt om een ​​nieuwe alinea te genereren:

Lettertype myfont = nieuw lettertype (); myfont.setStyle (Font.NORMAL); myfont.setSize (11); pdfDoc.add (nieuwe alinea ("\ n"));

Ten slotte gaan we alinea's toevoegen aan een nieuw gemaakt PDF-bestand:

BufferedReader br = nieuwe BufferedReader (nieuwe FileReader (bestandsnaam)); String strLine; while ((strLine = br.readLine ())! = null) {Paragraaf para = nieuwe paragraaf (strLine + "\ n", myfont); para.setAlignment (Element.ALIGN_JUSTIFIED); pdfDoc.add (para); } pdfDoc.close (); br.close ();

6. Conversies van PDF naar Docx

Het maken van een PDF-bestand van een Word-document is niet eenvoudig en we behandelen dit onderwerp hier niet. We raden bibliotheken van derden aan om dit te doen, zoals jWordConvert.

Om een ​​Microsoft Word-bestand van een pdf te maken, hebben we twee bibliotheken nodig. Beide bibliotheken zijn open source. De eerste is iText en het wordt gebruikt om de tekst uit een pdf-bestand te halen. De tweede is POI en wordt gebruikt om het.docx document.

Laten we eens kijken naar het codefragment voor het PDF-laadgedeelte:

XWPFDocument doc = nieuwe XWPFDocument (); String pdf = bestandsnaam; PdfReader reader = nieuwe PdfReader (pdf); PdfReaderContentParser parser = nieuwe PdfReaderContentParser (lezer); 

Na het laden van de PDF moeten we elke pagina afzonderlijk in de lus lezen en renderen en vervolgens naar het uitvoerbestand schrijven:

voor (int i = 1; i <= reader.getNumberOfPages (); i ++) {TextExtractionStrategy-strategie = parser.processContent (i, nieuwe SimpleTextExtractionStrategy ()); String text = strategy.getResultantText (); XWPFParagraph p = doc.createParagraph (); XWPFRun run = p.createRun (); run.setText (tekst); run.addBreak (BreakType.PAGE); } FileOutputStream out = nieuwe FileOutputStream ("src / output / pdf.docx"); doc.write (uit); // Sluit alle geopende bestanden

Houd er rekening mee dat met de SimpleTextExtractionStrategy () extractiestrategie, verliezen we alle opmaakregels. Om het probleem op te lossen, speelt u met extractiestrategieën die hier worden beschreven om een ​​complexere oplossing te krijgen.

7. PDF naar X commerciële bibliotheken

In eerdere secties hebben we open source-bibliotheken beschreven. Er zijn nog een paar bibliotheken die de moeite waard zijn om op te merken, maar ze worden betaald:

  • jPDFImages - jPDFImages kan afbeeldingen maken van pagina's in een PDF-document en deze exporteren als JPEG-, TIFF- of PNG-afbeeldingen.
  • JPEDAL - JPedal is een actief ontwikkelde en zeer capabele native Java PDF-bibliotheek SDK die wordt gebruikt voor het afdrukken, bekijken en converteren van bestanden
  • pdfcrowd - het is weer een Web / HTML naar PDF en PDF naar Web / HTML conversiebibliotheek, met geavanceerde GUI

8. Conclusie

In dit artikel hebben we de manieren besproken om converteer PDF-bestanden naar verschillende formaten.

De volledige implementatie van deze tutorial is te vinden in het GitHub-project - dit is een op Maven gebaseerd project. Om te testen, voert u gewoon de voorbeelden uit en ziet u de resultaten in het output map.