PDF-konverteringer i Java

1. Introduksjon

I denne raske artikkelen vil vi fokusere på å gjøre programmatisk konvertering mellom PDF-filer og andre formater i Java.

Mer spesifikt vil vi beskrive hvordan du lagrer PDF-filer som bildefiler, for eksempel PNG eller JPEG, konverterer PDF-filer til Microsoft Word-dokumenter, eksporterer som en HTML og trekker ut tekstene ved hjelp av flere Java open source-biblioteker.

2. Maven-avhengigheter

Det første biblioteket vi ser på er Pdf2Dom. La oss starte med de Maven-avhengighetene vi trenger å legge til i prosjektet vårt:

 org.apache.pdfbox pdfbox-verktøy 2.0.3 net.sf.cssbox pdf2dom 1.6 

Vi skal bruke den første avhengigheten til å laste den valgte PDF-filen. Den andre avhengigheten er ansvarlig for selve konverteringen. De nyeste versjonene finner du her: pdfbox-verktøy og pdf2dom.

I tillegg bruker vi iText for å trekke ut teksten fra en PDF-fil og POI å lage.docx dokument.

La oss ta en titt på Maven-avhengigheter som vi må inkludere i prosjektet vårt:

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

Den siste versjonen av iText finner du her, og du kan se etter Apache POI her.

3. PDF- og HTML-konverteringer

For å jobbe med HTML-filer bruker vi Pdf2Dom - en PDF-parser som konverterer dokumentene til en HTML DOM-representasjon. Det oppnådde DOM-treet kan deretter serieiseres til en HTML-fil eller behandles videre.

For å konvertere PDF til HTML, må vi bruke XMLWorker, biblioteket som er levert av iText.

3.1. PDF til HTML

La oss ta en titt på en enkel konvertering fra PDF til HTML:

privat tomrom generererHTMLFromPDF (strengfilnavn) {PDDocument pdf = PDDocument.load (ny fil (filnavn)); Skriverutgang = ny PrintWriter ("src / output / pdf.html", "utf-8"); ny PDFDomTree (). writeText (pdf, output); output.close (); } 

I kodebiten ovenfor laster vi PDF-filen ved hjelp av last-API fra PDFBox. Når PDF-filen er lastet inn, bruker vi parseren til å analysere filen og skrive til utdata spesifisert av java.io.Writer.

Noter det konvertering av PDF til HTML er aldri et 100% piksel-til-piksel-resultat. Resultatene avhenger av kompleksiteten og strukturen til den aktuelle PDF-filen.

3.2. HTML til PDF

La oss nå se på konvertering fra HTML til PDF:

privat statisk tomrom genererePDFFromHTML (Strengfilnavn) {Dokumentdokument = nytt Dokument (); PdfWriter skribent = PdfWriter.getInstance (dokument, ny FileOutputStream ("src / output / html.pdf")); document.open (); XMLWorkerHelper.getInstance (). ParseXHtml (skribent, dokument, ny FileInputStream (filnavn)); document.close (); }

Noter det konvertere HTML til PDF, må du sørge for at HTML har alle kodene riktig startet og lukket, ellers blir ikke PDF opprettet. Det positive ved denne tilnærmingen er at PDF blir opprettet nøyaktig det samme som det var i HTML-fil.

4. PDF til bildekonverteringer

Det er mange måter å konvertere PDF-filer til et bilde. En av de mest populære løsningene heter Apache PDFBox. Dette biblioteket er et open source Java-verktøy for å jobbe med PDF-dokumenter. For konvertering av bilde til PDF bruker vi iText en gang til.

4.1. PDF til bilde

For å begynne å konvertere PDF-filer til bilder, må vi bruke avhengighet nevnt i forrige avsnitt - pdfbox-verktøy.

La oss ta en titt på kodeeksemplet:

privat tomrom generereImageFromPDF (strengfilnavn, strengutvidelse) {PDDocument document = PDDocument.load (ny fil (filnavn)); PDFRenderer pdfRenderer = ny PDFRenderer (dokument); for (int side = 0; side <document.getNumberOfPages (); ++ side) {BufferedImage bim = pdfRenderer.renderImageWithDPI (side, 300, ImageType.RGB); ImageIOUtil.writeImage (bim, String.format ("src / output / pdf-% d.% S", side + 1, utvidelse), 300); } document.close (); }

Det er få viktige deler i ovennevnte kode. Vi må bruke PDFRenderer, for å gjengi PDF som en BufferedImage. Dessuten må hver side av PDF-filen gjengis separat.

Til slutt bruker vi ImageIOUtil, fra Apache PDFBox Tools, for å skrive et bilde med utvidelsen vi spesifiserer. Mulige filformater er jpeg, jpg, gif, tiff eller png.

Merk at Apache PDFBox er et avansert verktøy - vi kan lage våre egne PDF-filer fra bunnen av, fylle ut skjemaer i PDF-filen, signere og / eller kryptere PDF-filen.

4.2. Bilde til PDF

La oss ta en titt på kodeeksemplet:

privat statisk tomrom genererePDFFromImage (strengfilnavn, strengutvidelse) {Dokumentdokument = nytt dokument (); Strenginngang = filnavn + "." + utvidelse; String output = "src / output /" + extension + ".pdf"; FileOutputStream fos = ny FileOutputStream (output); PdfWriter skribent = PdfWriter.getInstance (dokument, fos); writer.open (); document.open (); document.add (Image.getInstance ((ny URL (input)))); document.close (); writer.close (); }

Vær oppmerksom på at vi kan tilby et bilde som en fil, eller laste det fra URL, slik det er vist i eksemplet ovenfor. Videre er utvidelsene av utdatafilen vi kan bruke jpeg, jpg, gif, tiff eller png.

5. PDF til tekstkonvertering

For å trekke ut rå teksten ut av en PDF-fil, bruker vi også Apache PDFBox en gang til. For konvertering av tekst til PDF skal vi bruke iText.

5.1. PDF til tekst

Vi opprettet en metode som heter generereTxtFromPDF (…) og delte deni tre hoveddeler: lasting av PDF-filen, utpakking av tekst og endelig filoppretting.

La oss starte med lasting av del:

Fil f = ny fil (filnavn); String parsedText; PDFParser-parser = ny PDFParser (ny RandomAccessFile (f, "r")); parser.parse ();

For å lese en PDF-fil bruker vi PDFParser, med et “r” (les) alternativ. Videre må vi bruke parser.parse () metode som vil føre til at PDF blir analysert som en strøm og fylt inn i COSDocument gjenstand.

La oss ta en titt på den utpakkende tekstdelen:

COSDocument cosDoc = parser.getDocument (); PDFTextStripper pdfStripper = ny PDFTextStripper (); PDDocument pdDoc = nytt PDDocument (cosDoc); parsedText = pdfStripper.getText (pdDoc);

I første linje sparer vi COSDocument inne i cosDoc variabel. Den vil deretter bli brukt til å konstruere PD-dokument, som er representasjonen for PDF-dokumentet i minnet. Til slutt vil vi bruke PDFTextStripper for å returnere råteksten til et dokument. Etter alle disse operasjonene, må vi bruke Lukk() metode for å lukke alle brukte strømmer.

I den siste delen lagrer vi tekst i den nyopprettede filen ved hjelp av den enkle Java PrintWriter:

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

Vær oppmerksom på at du ikke kan bevare formatering i en ren tekstfil fordi den bare inneholder tekst.

5.2. Tekst til PDF

Det er litt vanskelig å konvertere tekstfiler til PDF. For å opprettholde filformateringen, må du bruke flere regler.

I det følgende eksemplet tar vi ikke hensyn til formateringen av filen.

Først må vi definere størrelsen på PDF-filen, versjonen og utdatafilen. La oss ta en titt på kodeeksemplet:

Dokument pdfDoc = nytt dokument (PageSize.A4); PdfWriter.getInstance (pdfDoc, ny FileOutputStream ("src / output / txt.pdf")) .setPdfVersion (PdfWriter.PDF_VERSION_1_7); pdfDoc.open ();

I neste trinn vil vi definere skriften og også kommandoen som brukes til å generere et nytt avsnitt:

Font myfont = ny skrift (); myfont.setStyle (Font.NORMAL); myfont.setSize (11); pdfDoc.add (nytt avsnitt ("\ n"));

Til slutt skal vi legge til avsnitt i nyopprettet PDF-fil:

BufferedReader br = ny BufferedReader (ny FileReader (filnavn)); Streng strline; mens ((strLine = br.readLine ())! = null) {Paragraph para = new Paragraph (strLine + "\ n", myfont); para.setAlignment (Element.ALIGN_JUSTIFIED); pdfDoc.add (para); } pdfDoc.close (); br.close ();

6. PDF til Docx-konverteringer

Det er ikke lett å lage PDF-filer fra Word-dokumenter, og vi vil ikke dekke dette emnet her. Vi anbefaler tredjepartsbiblioteker å gjøre det, som jWordConvert.

For å opprette Microsoft Word-fil fra en PDF trenger vi to biblioteker. Begge bibliotekene er åpen kildekode. Den første er iText og den brukes til å trekke ut teksten fra en PDF-fil. Den andre er POI og brukes til å lage.docx dokument.

La oss ta en titt på kodebiten for PDF-lastedelen:

XWPFDocument doc = nytt XWPFDocument (); Streng pdf = filnavn; PdfReader reader = ny PdfReader (pdf); PdfReaderContentParser parser = ny PdfReaderContentParser (leser); 

Etter å ha lastet inn PDF-en, må vi lese og gjengi hver side separat i løkken, og deretter skrive til utdatafilen:

for (int i = 1; i <= reader.getNumberOfPages (); i ++) {TextExtractionStrategy strategy = parser.processContent (i, ny SimpleTextExtractionStrategy ()); Strengtekst = strategi.getResultantText (); XWPFParagraph p = doc.createParagraph (); XWPFRun run = p.createRun (); run.setText (tekst); run.addBreak (BreakType.PAGE); } FileOutputStream ut = ny FileOutputStream ("src / output / pdf.docx"); doc.write (ut); // Lukk alle åpne filer

Vær oppmerksom på at med SimpleTextExtractionStrategy () utvinningsstrategi, mister vi alle formateringsregler. For å fikse det, spill med ekstraksjonsstrategier som er beskrevet her, for å oppnå en mer kompleks løsning.

7. PDF til X kommersielle biblioteker

I tidligere seksjoner beskrev vi open source-biblioteker. Det er få flere biblioteker det er verdt å legge merke til, men de blir betalt:

  • jPDFImages - jPDFImages kan opprette bilder fra sider i et PDF-dokument og eksportere dem som JPEG-, TIFF- eller PNG-bilder.
  • JPEDAL - JPedal er et aktivt utviklet og veldig dyktig innfødt Java PDF-bibliotek SDK brukt til utskrift, visning og konvertering av filer
  • pdfcrowd - det er et annet web / HTML til PDF og PDF til web / HTML konverteringsbibliotek, med avansert GUI

8. Konklusjon

I denne artikkelen diskuterte vi måtene å konvertere PDF-fil til forskjellige formater.

Den fulle implementeringen av denne veiledningen finner du i GitHub-prosjektet - dette er et Maven-basert prosjekt. For å teste, bare kjør eksemplene og se resultatene i produksjon mappe.