Konverzie PDF v Jave

1. Úvod

V tomto rýchlom článku sa zameriame na programové aktivity prevod medzi súbormi PDF a inými formátmi v prostredí Java.

Konkrétnejšie popíšeme, ako ukladať súbory PDF ako obrazové súbory, napríklad PNG alebo JPEG, prevádzať súbory PDF do dokumentov programu Microsoft Word, exportovať ako HTML a extrahovať texty pomocou viacerých otvorených knižníc Java.

2. Maven závislosti

Prvá knižnica, ktorú si pozrieme, je Pdf2Dom. Začnime so závislosťami Maven, ktoré musíme do nášho projektu pridať:

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

Použijeme prvú závislosť na načítanie vybratého súboru PDF. Druhá závislosť je zodpovedná za samotnú konverziu. Najnovšie verzie nájdete tu: pdfbox-tools a pdf2dom.

A čo viac, použijeme iText extrahovať text zo súboru PDF a POI vytvoriť.docx dokument.

Poďme sa pozrieť na závislosti Maven, ktoré musíme zahrnúť do nášho projektu:

 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 

Najnovšiu verziu iTextu nájdete tu a Apache POI nájdete tu.

3. Konverzie PDF a HTML

Na prácu so súbormi HTML použijeme Pdf2Dom - analyzátor PDF, ktorý prevádza dokumenty na reprezentáciu HTML DOM. Získaný strom DOM je potom možné serializovať do súboru HTML alebo ďalej spracovať.

Na prevod PDF do HTML musíme použiť knižnicu XMLWorker, ktorú poskytuje iText.

3.1. PDF do HTML

Pozrime sa na jednoduchú konverziu z PDF do HTML:

private void generateHTMLFromPDF (názov súboru reťazca) {PDDocument pdf = PDDocument.load (nový súbor (názov súboru)); Výstup zapisovača = nový PrintWriter ("src / output / pdf.html", "utf-8"); nový PDFDomTree (). writeText (pdf, výstup); output.close (); } 

V útržku kódu vyššie načítame súbor PDF pomocou načítavacieho rozhrania API z PDFBoxu. Po načítaní súboru PDF použijeme syntaktický analyzátor na analýzu súboru a zápis na výstup uvedený v java.io.Spisovateľ.

Poznač si to prevod PDF do HTML nikdy nie je 100% výsledkom pomer pixelov. Výsledky závisia od zložitosti a štruktúry konkrétneho súboru PDF.

3.2. HTML do PDF

Poďme sa teraz pozrieť na prevod z HTML na PDF:

private static void generatePDFFromHTML (názov súboru reťazca) {dokument dokument = nový dokument (); PdfWriter writer = PdfWriter.getInstance (dokument, nový FileOutputStream ("src / output / html.pdf")); document.open (); XMLWorkerHelper.getInstance (). ParseXHtml (zapisovač, dokument, nový FileInputStream (názov súboru)); document.close (); }

Poznač si to pri prevode HTML do PDF je potrebné zabezpečiť, aby HTML mal všetky značky správne spustené a zatvorené, inak sa PDF nevytvorí. Pozitívnym aspektom tohto prístupu je, že PDF sa bude vytvárať úplne rovnako ako v súbore HTML.

4. Konverzie PDF na obrázok

Existuje mnoho spôsobov, ako prevádzať súbory PDF do obrázka. Jedno z najpopulárnejších riešení je pomenované Apache PDFBox. Táto knižnica je otvorený zdrojový program Java pre prácu s dokumentmi PDF. Na prevod obrázkov na PDF použijeme iText ešte raz.

4.1. PDF do obrázka

Ak chcete začať prevádzať súbory PDF do obrázkov, musíme použiť závislosť uvedenú v predchádzajúcej časti - pdfbox-tools.

Pozrime sa na príklad kódu:

private void generateImageFromPDF (názov súboru reťazca, rozšírenie reťazca) {PDDocument document = PDDocument.load (nový súbor (názov súboru)); PDFRenderer pdfRenderer = nový PDFRenderer (dokument); for (int page = 0; page <document.getNumberOfPages (); ++ page) {BufferedImage bim = pdfRenderer.renderImageWithDPI (stránka, 300, ImageType.RGB); ImageIOUtil.writeImage (bim, String.format ("src / output / pdf-% d.% S", stránka + 1, rozšírenie), 300); } document.close (); }

Vo vyššie uvedenom kóde je niekoľko dôležitých častí. Musíme použiť PDFRenderer, aby bolo možné PDF vykresliť ako a BufferedImage. Každá stránka súboru PDF musí byť tiež vykreslená osobitne.

Nakoniec použijeme ImageIOUtil, od Apache PDFBox Tools, na napísanie obrázka s príponou, ktorú zadáme. Možné formáty súborov sú jpeg, jpg, gif, tiff alebo png.

Upozorňujeme, že Apache PDFBox je pokročilý nástroj - môžeme vytvoriť úplne nové súbory PDF, vyplniť formuláre v súbore PDF, podpísať alebo zašifrovať súbor PDF.

4.2. Obrázok do formátu PDF

Pozrime sa na príklad kódu:

private static void generatePDFFromImage (názov súboru reťazca, rozšírenie reťazca) {dokument dokumentu = nový dokument (); Reťazcový vstup = názov súboru + "." + predĺženie; Reťazcový výstup = "src / output /" + rozšírenie + ".pdf"; FileOutputStream fos = nový FileOutputStream (výstup); Zapisovateľ PdfWriter = PdfWriter.getInstance (document, fos); spisovateľ.open (); document.open (); document.add (Image.getInstance ((nová adresa URL (vstup)))); document.close (); writer.close (); }

Upozorňujeme, že môžeme poskytnúť obrázok ako súbor alebo ho načítať z adresy URL, ako je to znázornené v príklade vyššie. Ďalej existujú prípony výstupného súboru, ktoré môžeme použiť jpeg, jpg, gif, tiff alebo png.

5. Konverzie PDF na text

Na extrahovanie nespracovaného textu zo súboru PDF použijeme tiež Apache PDFBox ešte raz. Pre prevod textu na PDF použijeme iText.

5.1. PDF na text

Vytvorili sme metódu s názvom generateTxtFromPDF (…) a rozdelil todo troch hlavných častí: načítanie súboru PDF, extrakcia textu a konečné vytvorenie súboru.

Začnime načítaním časti:

Súbor f = nový Súbor (názov súboru); Reťazec parsedText; Analyzátor PDFParser = nový PDFParser (nový RandomAccessFile (f, "r")); parser.parse ();

Na prečítanie súboru PDF používame program PDFParser, s možnosťou „r“ (čítať). Okrem toho musíme použiť parser.parse () Metóda, ktorá spôsobí, že súbor PDF bude analyzovaný ako prúd a naplnený do súboru Dokument COS objekt.

Pozrime sa na extrakčnú textovú časť:

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

V prvom riadku uložíme Dokument COS vnútri cosDoc premenná. Potom sa použije na konštrukciu PDocument, čo je reprezentácia dokumentu PDF v pamäti. Nakoniec použijeme PDFTextStripper vráti nespracovaný text dokumentu. Po všetkých týchto operáciách budeme musieť použiť Zavrieť() metóda na zatvorenie všetkých použitých streamov.

V poslednej časti uložíme text do novovytvoreného súboru pomocou jednoduchej Javy PrintWriter:

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

Upozorňujeme, že formátovanie v obyčajnom textovom súbore nemôžete zachovať, pretože obsahuje iba text.

5.2. Text do PDF

Prevod textových súborov do PDF je trochu zložitý. Z dôvodu zachovania formátovania súboru budete musieť použiť ďalšie pravidlá.

V nasledujúcom príklade neberieme do úvahy formátovanie súboru.

Najskôr musíme definovať veľkosť súboru PDF, verziu a výstupný súbor. Pozrime sa na príklad kódu:

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

V ďalšom kroku definujeme písmo a tiež príkaz, ktorý sa použije na vygenerovanie nového odseku:

Písmo myfont = nové Písmo (); myfont.setStyle (Font.NORMAL); myfont.setSize (11); pdfDoc.add (nový odsek ("\ n"));

Nakoniec pridáme odseky do novovytvoreného súboru PDF:

BufferedReader br = nový BufferedReader (nový FileReader (názov súboru)); Reťazec strLine; while ((strLine = br.readLine ())! = null) {odsek para = nový odsek (strLine + "\ n", myfont); para.setAlignment (Element.ALIGN_JUSTIFIED); pdfDoc.add (ods.); } pdfDoc.close (); br.close ();

6. Konverzie PDF na Docx

Vytvorenie súboru PDF z dokumentu Word nie je ľahké a tejto téme sa tu nebudeme venovať. Odporúčame to napríklad knižniciam tretích strán jWordConvert.

Na vytvorenie súboru Microsoft Word z PDF budeme potrebovať dve knižnice. Obidve knižnice sú open source. Prvý z nich je iText a používa sa na extrakciu textu zo súboru PDF. Druhá je POI a používa sa na vytvorenie súboru.docx dokument.

Pozrime sa na útržok kódu pre časť načítania PDF:

XWPFDocument doc = nový XWPFDocument (); Reťazec pdf = názov súboru; Čítačka PdfReader = nový PdfReader (pdf); Analyzátor PdfReaderContentParser = nový PdfReaderContentParser (čítačka); 

Po načítaní PDF musíme prečítať a vykresliť každú stránku zvlášť v cykle a potom zapísať do výstupného súboru:

for (int i = 1; i <= reader.getNumberOfPages (); i ++) {TextExtractionStrategy strategy = parser.processContent (i, new SimpleTextExtractionStrategy ()); Reťazec text = strategy.getResultantText (); XWPFParagraph p = doc.createParagraph (); Beh XWPFRun = p.createRun (); run.setText (text); run.addBreak (BreakType.PAGE); } Výstup FileOutputStream = nový FileOutputStream ("src / output / pdf.docx"); doc.write (out); // Zatvorí všetky otvorené súbory

Upozorňujeme, že s SimpleTextExtractionStrategy () stratégie extrakcie, prídeme o všetky pravidlá formátovania. Aby ste to napravili, pohrajte sa s tu opísanými extrakčnými stratégiami, aby ste dosiahli komplexnejšie riešenie.

7. Komerčné knižnice PDF až X

V predchádzajúcich častiach sme si opísali knižnice otvoreného zdroja. Existuje niekoľko ďalších knižníc, ktoré stoja za pozornosť, ale sú platené:

  • jPDFImages - jPDFImages môže vytvárať obrázky zo stránok v dokumente PDF a exportovať ich ako obrázky JPEG, TIFF alebo PNG.
  • JPEDAL - JPedal je aktívne vyvinutá a veľmi schopná natívna knižnica Java PDF SDK používaná na tlač, prezeranie a konverziu súborov
  • pdfcrowd - je to ďalšia knižnica na konverziu z formátu Web / HTML na PDF a PDF na web / HTML s pokročilým grafickým rozhraním

8. Záver

V tomto článku sme diskutovali o spôsoboch, ako previesť súbor PDF do rôznych formátov.

Celú implementáciu tohto tutoriálu nájdete v projekte GitHub - jedná sa o projekt založený na Maven. Ak chcete otestovať, jednoducho spustite príklady a pozrite si výsledky v výkon priečinok.