PDF pretvorbe u Javi

1. Uvod

U ovom ćemo se kratkom članku usredotočiti na programsko pretvorba između PDF datoteka i drugih formata u Javi.

Točnije, opisat ćemo kako spremati PDF-ove kao slikovne datoteke, kao što su PNG ili JPEG, pretvoriti PDF-ove u Microsoft Word dokumente, izvesti kao HTML i izvući tekstove pomoću više Java otvorenih biblioteka.

2. Ovisnosti Mavena

Prva knjižnica koju ćemo pogledati je Pdf2Dom. Počnimo s Mavenovim ovisnostima koje trebamo dodati našem projektu:

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

Koristit ćemo prvu ovisnost za učitavanje odabrane PDF datoteke. Druga ovisnost odgovorna je za samu pretvorbu. Najnovije verzije možete pronaći ovdje: pdfbox-tools i pdf2dom.

Štoviše, koristit ćemo iText za izdvajanje teksta iz PDF datoteke i POI stvoriti.docx dokument.

Pogledajmo Mavenove ovisnosti koje moramo uključiti u naš 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 

Najnoviju verziju iText-a možete pronaći ovdje, a Apache POI potražite ovdje.

3. Pretvorbe u PDF i HTML

Mi ćemo koristiti za rad s HTML datotekama Pdf2Dom - PDF parser koji pretvara dokumente u HTML DOM prikaz. Tada se dobiveno DOM stablo može serializirati u HTML datoteku ili dalje obraditi.

Da bismo pretvorili PDF u HTML, trebamo koristiti XMLWorker, biblioteku koju pruža iText.

3.1. PDF u HTML

Pogledajmo jednostavnu pretvorbu iz PDF-a u HTML:

privatna praznina generiraHTMLFromPDF (naziv datoteke niza) {PDDocument pdf = PDDocument.load (nova datoteka (naziv datoteke)); Izlaz za pisanje = novi PrintWriter ("src / output / pdf.html", "utf-8"); novi PDFDomTree (). writeText (pdf, izlaz); output.close (); } 

U isječku koda gore učitavamo PDF datoteku, koristeći API za učitavanje iz PDFBox-a. S učitanim PDF-om, koristimo parser za raščlanjivanje datoteke i zapisivanje u izlaz koji je odredio java.io.Pisac.

Imajte na umu da pretvaranje PDF-a u HTML nikada nije rezultat od 100%, piksel u piksel. Rezultati ovise o složenosti i strukturi određene PDF datoteke.

3.2. HTML u PDF

Sada, pogledajmo pretvorbu iz HTML-a u PDF:

privatna statička praznina generirajPDFFromHTML (naziv datoteke niza) {Dokument dokumenta = novi dokument (); PdfWriter Writer = PdfWriter.getInstance (dokument, novi FileOutputStream ("src / output / html.pdf")); document.open (); XMLWorkerHelper.getInstance (). ParseXHtml (program za pisanje, dokument, novi FileInputStream (naziv datoteke)); document.close (); }

Imajte na umu da pretvarajući HTML u PDF, morate osigurati da HTML ima sve oznake pravilno pokrenute i zatvorene, inače PDF neće biti stvoren. Pozitivan aspekt ovog pristupa je taj što će se PDF stvoriti potpuno isti kao i u HTML datoteci.

4. Pretvorbe PDF u slike

Postoji mnogo načina pretvaranja PDF datoteka u sliku. Imenovano je jedno od najpopularnijih rješenja Apache PDFBox. Ova je knjižnica otvoreni izvor Java alata za rad s PDF dokumentima. Za pretvorbu slike u PDF koristit ćemo iText opet.

4.1. PDF u sliku

Da bismo započeli s pretvaranjem PDF-a u slike, moramo koristiti ovisnost spomenutu u prethodnom odjeljku - pdfbox-alati.

Pogledajmo primjer koda:

private void generirajImageFromPDF (naziv datoteke niza, ekstenzija niza) {PDDocument document = PDDocument.load (nova datoteka (naziv datoteke)); PDFRenderer pdfRenderer = novi PDFRenderer (dokument); for (int page = 0; page <document.getNumberOfPages (); ++ page) {BufferedImage bim = pdfRenderer.renderImageWithDPI (stranica, 300, ImageType.RGB); ImageIOUtil.writeImage (bim, String.format ("src / output / pdf-% d.% S", stranica + 1, proširenje), 300); } document.close (); }

U gore spomenutom kodu ima nekoliko važnih dijelova. Moramo koristiti PDFRenderer, kako bi se PDF prikazao kao Slika u baferu. Također, svaku stranicu PDF datoteke treba prikazati zasebno.

Konačno, koristimo ImageIOUtiliz Apache PDFBox Tools za pisanje slike s nastavkom koji smo naveli. Mogući formati datoteka su jpeg, jpg, gif, tiff ili png.

Imajte na umu da je Apache PDFBox napredni alat - možemo stvoriti vlastite PDF datoteke ispočetka, ispuniti obrasce unutar PDF datoteke, potpisati i / ili šifrirati PDF datoteku.

4.2. Slika u PDF

Pogledajmo primjer koda:

privatna statička praznina generiraj PDFromImage (naziv datoteke niza, ekstenzija niza) {Dokument dokumenta = novi dokument (); String input = naziv datoteke + "." + produžetak; Izlaz niza = "src / output /" + proširenje + ".pdf"; FileOutputStream fos = novi FileOutputStream (izlaz); PdfWriter Writer = PdfWriter.getInstance (dokument, fos); pisac.open (); document.open (); document.add (Image.getInstance ((novi URL (ulaz)))); document.close (); pisac.close (); }

Imajte na umu da sliku možemo pružiti kao datoteku ili je učitati s URL-a, kao što je prikazano u gornjem primjeru. Štoviše, nastavci izlazne datoteke koje možemo koristiti jesu jpeg, jpg, gif, tiff ili png.

5. Pretvorbe u PDF u tekst

Također ćemo upotrijebiti za izdvajanje sirovog teksta iz PDF datoteke Apache PDFBox opet. Za pretvorbu teksta u PDF koristit ćemo iText.

5.1. PDF u tekst

Stvorili smo metodu nazvanu generirajTxtFromPDF (…) i podijelila gau tri glavna dijela: učitavanje PDF datoteke, izdvajanje teksta i konačno stvaranje datoteke.

Počnimo s učitavanjem dijela:

Datoteka f = nova datoteka (naziv datoteke); String parsedText; PDFParser parser = novi PDFParser (novi RandomAccessFile (f, "r")); raščlanjivač.parse ();

Za čitanje PDF datoteke koristimo PDFParser, s opcijom „r“ (čitanje). Štoviše, trebamo koristiti raščlanjivač.parse () metoda koja će uzrokovati raščlanjivanje PDF-a kao struje i popunjavanje u COSDokumenta objekt.

Pogledajmo dio izdvajanja teksta:

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

U prvom ćemo redu uštedjeti COSDokumenta unutar cosDoc varijabilna. Tada će se koristiti za konstrukciju PDokument, što je predstavljanje PDF dokumenta u memoriji. Napokon ćemo upotrijebiti PDFTextStripper za povratak sirovog teksta dokumenta. Nakon svih tih operacija morat ćemo se poslužiti Zatvoriti() metoda za zatvaranje svih korištenih tokova.

U posljednjem dijelu spremit ćemo tekst u novostvorenu datoteku pomoću jednostavne Jave PrintWriter:

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

Imajte na umu da ne možete sačuvati oblikovanje u običnoj tekstualnoj datoteci jer ona sadrži samo tekst.

5.2. Tekst u PDF

Pretvaranje tekstualnih datoteka u PDF pomalo je nezgodno. Da biste zadržali oblikovanje datoteke, morat ćete primijeniti dodatna pravila.

U sljedećem primjeru ne uzimamo u obzir oblikovanje datoteke.

Prvo, moramo definirati veličinu PDF datoteke, verziju i izlaznu datoteku. Pogledajmo primjer koda:

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

U sljedećem koraku definirat ćemo font i naredbu koja se koristi za generiranje novog odlomka:

Font myfont = novi Font (); myfont.setStyle (Font.NORMALNO); myfont.setSize (11); pdfDoc.add (novi odlomak ("\ n"));

Na kraju ćemo dodati odlomke u novostvorenu PDF datoteku:

BufferedReader br = novi BufferedReader (novi FileReader (naziv datoteke)); Niz strLine; while ((strLine = br.readLine ())! = null) {Paragraf para = novi odlomak (strLine + "\ n", myfont); para.setAlignment (Element.ALIGN_JUSTIFIED); pdfDoc.add (para); } pdfDoc.close (); br.close ();

6. Pretvorbe PDF u Docx

Stvaranje PDF datoteke iz Wordova dokumenta nije jednostavno i ovdje nećemo obrađivati ​​ovu temu. Preporučujemo bibliotekama trećih strana da to učine, poput jWordConvert.

Za stvaranje datoteke Microsoft Word iz PDF-a trebat će nam dvije knjižnice. Obje su knjižnice otvorenog koda. Prva je iText a koristi se za izdvajanje teksta iz PDF datoteke. Drugi je POI i koristi se za stvaranje.docx dokument.

Pogledajmo isječak koda za dio za učitavanje PDF-a:

XWPFDocument doc = novi XWPFDocument (); Niz pdf = naziv datoteke; Čitač PdfReader = novi PdfReader (pdf); PdfReaderContentParser parser = novi PdfReaderContentParser (čitač); 

Nakon učitavanja PDF-a, moramo pročitati i prikazati svaku stranicu zasebno u petlji, a zatim zapisati u izlaznu datoteku:

for (int i = 1; i <= reader.getNumberOfPages (); i ++) {TextExtractionStrategy strategy = parser.processContent (i, novi SimpleTextExtractionStrategy ()); Tekst niza = strategy.getResultantText (); XWPFParagraph p = doc.createParagraph (); XWPFRun run = p.createRun (); run.setText (tekst); run.addBreak (BreakType.PAGE); } FileOutputStream out = novi FileOutputStream ("src / output / pdf.docx"); doc.write (out); // Zatvorite sve otvorene datoteke

Imajte na umu da uz SimpleTextExtractionStrategy () strategiju ekstrakcije, izgubit ćemo sva pravila oblikovanja. Da biste ga popravili, poigrajte se ovdje opisanim strategijama vađenja kako biste postigli složenije rješenje.

7. PDF u X komercijalne knjižnice

U prethodnim smo odjeljcima opisali biblioteke otvorenog koda. Postoji još nekoliko knjižnica koje vrijedi primijetiti, ali one se plaćaju:

  • jPDFImages - jPDFImages može stvoriti slike sa stranica u PDF dokumentu i izvesti ih u JPEG, TIFF ili PNG slike.
  • JPEDAL - JPedal je aktivno razvijeni i vrlo sposobni izvorni Java PDF SDK knjižnica koji se koristi za ispis, pregled i pretvorbu datoteka
  • pdfcrowd - to je još jedna biblioteka za pretvorbu Web / HTML u PDF i PDF u Web / HTML, s naprednim GUI-jem

8. Zaključak

U ovom smo članku razgovarali o načinima na koji pretvoriti PDF datoteku u razne formate.

Potpuna implementacija ovog vodiča može se naći u projektu GitHub - ovo je projekt zasnovan na Mavenu. Da biste testirali, jednostavno pokrenite primjere i pogledajte rezultate u izlaz mapu.