PDF-konverteringer i Java

1. Introduktion

I denne hurtige artikel vil vi fokusere på at gøre programmatisk konvertering mellem PDF-filer og andre formater i Java.

Mere specifikt beskriver vi, hvordan du gemmer PDF-filer som billedfiler, såsom PNG eller JPEG, konverterer PDF-filer til Microsoft Word-dokumenter, eksporterer som en HTML og udtrækker teksterne ved hjælp af flere Java open source-biblioteker.

2. Maven-afhængigheder

Det første bibliotek, vi ser på, er Pdf2Dom. Lad os starte med de Maven-afhængigheder, vi skal tilføje til vores projekt:

 org.apache.pdfbox pdfbox-værktøjer 2.0.3 net.sf.cssbox pdf2dom 1.6 

Vi bruger den første afhængighed til at indlæse den valgte PDF-fil. Den anden afhængighed er ansvarlig for selve konverteringen. De seneste versioner kan findes her: pdfbox-værktøjer og pdf2dom.

Hvad mere er, vi bruger iText for at udtrække teksten fra en PDF-fil og POI at oprette.docx dokument.

Lad os se på Maven-afhængigheder, som vi skal medtage i vores projekt:

 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 seneste version af iText kan findes her, og du kan se efter Apache POI her.

3. PDF- og HTML-konverteringer

For at arbejde med HTML-filer, vi bruger Pdf2Dom - en PDF-parser, der konverterer dokumenterne til en HTML DOM-repræsentation. Det opnåede DOM-træ kan derefter serieiseres til en HTML-fil eller behandles yderligere.

For at konvertere PDF til HTML skal vi bruge XMLWorker, det bibliotek, der leveres af iText.

3.1. PDF til HTML

Lad os se på en simpel konvertering fra PDF til HTML:

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

I kodestykket ovenfor indlæser vi PDF-filen ved hjælp af load API fra PDFBox. Når PDF-filen er indlæst, bruger vi parseren til at analysere filen og skrive til output, der er specificeret af java.io.Writer.

Noter det konvertering af PDF til HTML er aldrig et 100% pixel-til-pixel-resultat. Resultaterne afhænger af kompleksiteten og strukturen i den bestemte PDF-fil.

3.2. HTML til PDF

Lad os nu se på konvertering fra HTML til PDF:

privat statisk tomrum genererePDFFromHTML (strengfilnavn) {Dokumentdokument = nyt dokument (); PdfWriter-forfatter = PdfWriter.getInstance (dokument, ny FileOutputStream ("src / output / html.pdf")); document.open (); XMLWorkerHelper.getInstance (). ParseXHtml (forfatter, dokument, nyt FileInputStream (filnavn)); document.close (); }

Noter det konvertere HTML til PDF, skal du sikre dig, at HTML har alle tags korrekt startet og lukket, ellers oprettes ikke PDF. Det positive aspekt ved denne tilgang er, at PDF oprettes nøjagtigt det samme som det var i HTML-fil.

4. PDF til billedkonverteringer

Der er mange måder at konvertere PDF-filer til et billede. En af de mest populære løsninger er navngivet Apache PDFBox. Dette bibliotek er et open source Java-værktøj til at arbejde med PDF-dokumenter. Til konvertering af billede til PDF bruger vi iText igen.

4.1. PDF til billede

For at begynde at konvertere PDF-filer til billeder skal vi bruge afhængighed nævnt i det foregående afsnit - pdfbox-værktøjer.

Lad os se på kodeeksemplet:

privat tomrum generereImageFromPDF (strengfilnavn, strengudvidelse) {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, udvidelse), 300); } document.close (); }

Der er få vigtige dele i ovennævnte kode. Vi er nødt til at bruge PDFRenderer, for at gengive PDF som en BufferedImage. Hver side i PDF-filen skal også gengives separat.

Endelig bruger vi ImageIOUtilfra Apache PDFBox Tools for at skrive et billede med den udvidelse, vi angiver. Mulige filformater er jpeg, jpg, gif, tiff eller png.

Bemærk, at Apache PDFBox er et avanceret værktøj - vi kan oprette vores egne PDF-filer fra bunden, udfylde formularer i PDF-fil, underskrive og / eller kryptere PDF-filen.

4.2. Billede til PDF

Lad os se på kodeeksemplet:

privat statisk tomrum genererePDFFromImage (strengfilnavn, strengudvidelse) {Dokumentdokument = nyt dokument (); Strenginput = filnavn + "." + udvidelse; String output = "src / output /" + extension + ".pdf"; FileOutputStream fos = ny FileOutputStream (output); PdfWriter forfatter = PdfWriter.getInstance (dokument, fos); writer.open (); document.open (); document.add (Image.getInstance ((ny URL (input)))); document.close (); writer.close (); }

Bemærk, at vi kan levere et billede som en fil eller indlæse det fra URL, som det er vist i eksemplet ovenfor. Desuden er udvidelserne af outputfilen, som vi kan bruge, jpeg, jpg, gif, tiff eller png.

5. PDF til tekstkonverteringer

For at udtrække den rå tekst ud af en PDF-fil bruger vi også Apache PDFBox igen. Til konvertering af tekst til PDF skal vi bruge iText.

5.1. PDF til tekst

Vi oprettede en metode, der hedder generereTxtFromPDF (…) og delte deti tre hoveddele: indlæsning af PDF-filen, udtrækning af tekst og endelig oprettelse af fil.

Lad os starte med at indlæse en del:

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

For at læse en PDF-fil bruger vi PDFParser, med en “r” (læs) mulighed. Desuden er vi nødt til at bruge parser.parse () metode, der får PDF til at blive parset som en stream og udfyldt i COSDocument objekt.

Lad os tage et kig på den uddragne tekstdel:

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

I første linje gemmer vi COSDocument inde i cosDoc variabel. Det vil derefter blive brugt til at konstruere PD-dokument, som er PDF-dokumentets gengivelse i hukommelsen. Endelig vil vi bruge PDFTextStripper for at returnere den rå tekst i et dokument. Efter alle disse operationer skal vi bruge tæt() metode til at lukke alle de brugte streams.

I den sidste del gemmer vi tekst i den nyoprettede fil ved hjælp af den enkle Java PrintWriter:

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

Bemærk, at du ikke kan bevare formatering i en almindelig tekstfil, fordi den kun indeholder tekst.

5.2. Tekst til PDF

At konvertere tekstfiler til PDF er lidt vanskeligt. For at vedligeholde filformateringen skal du anvende yderligere regler.

I det følgende eksempel tager vi ikke hensyn til formateringen af ​​filen.

Først skal vi definere størrelsen på PDF-filen, versionen og outputfilen. Lad os se på kodeeksemplet:

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

I det næste trin definerer vi skrifttypen og også den kommando, der bruges til at generere nyt afsnit:

Skrifttype myfont = ny skrifttype (); myfont.setStyle (Font.NORMAL); myfont.setSize (11); pdfDoc.add (nyt afsnit ("\ n"));

Endelig vil vi tilføje afsnit til nyoprettet PDF-fil:

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

6. PDF til Docx-konverteringer

Oprettelse af PDF-fil fra Word-dokument er ikke let, og vi dækker ikke dette emne her. Vi anbefaler tredjepartsbiblioteker at gøre det ligesom jWordConvert.

For at oprette Microsoft Word-fil fra en PDF har vi brug for to biblioteker. Begge biblioteker er open source. Den første er iText og det bruges til at udtrække teksten fra en PDF-fil. Den anden er POI og bruges til at oprette.docx dokument.

Lad os se på kodestykket til PDF-indlæsningsdelen:

XWPFDocument doc = nyt XWPFDocument (); Streng pdf = filnavn; PdfReader-læser = ny PdfReader (pdf); PdfReaderContentParser parser = ny PdfReaderContentParser (læser); 

Efter indlæsning af PDF skal vi læse og gengive hver side separat i sløjfen og derefter skrive til outputfilen:

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 out = ny FileOutputStream ("src / output / pdf.docx"); doc.write (ud); // Luk alle åbne filer

Bemærk, at med SimpleTextExtractionStrategy () ekstraktionsstrategi, mister vi alle formateringsregler. For at ordne det skal du lege med ekstraktionsstrategier, der er beskrevet her, for at opnå en mere kompleks løsning.

7. PDF til X kommercielle biblioteker

I tidligere afsnit beskrev vi open source-biblioteker. Der er få flere biblioteker, der er værd at lægge mærke til, men de betales:

  • jPDFImages - jPDFImages kan oprette billeder fra sider i et PDF-dokument og eksportere dem som JPEG-, TIFF- eller PNG-billeder.
  • JPEDAL - JPedal er et aktivt udviklet og meget kapabelt indbygget Java PDF-bibliotek SDK, der bruges til udskrivning, visning og konvertering af filer
  • pdfcrowd - det er et andet web / HTML til PDF og PDF til web / HTML konverteringsbibliotek med avanceret GUI

8. Konklusion

I denne artikel diskuterede vi måderne til konvertere PDF-fil til forskellige formater.

Den fulde implementering af denne vejledning kan findes i GitHub-projektet - dette er et Maven-baseret projekt. For at teste skal du bare køre eksemplerne og se resultaterne i produktion folder.