PDF-konverziók Java-ban

1. Bemutatkozás

Ebben a rövid cikkben az automatizálásra koncentrálunk konvertálás a PDF fájlok és más Java formátumok között.

Pontosabban leírjuk, hogyan lehet PDF-eket menteni képfájlokként, például PNG vagy JPEG formátumban, konvertálni a PDF-fájlokat Microsoft Word-dokumentumokká, exportálni HTML-ként, és kivonni a szövegeket több Java nyílt forráskódú könyvtár használatával.

2. Maven-függőségek

Az első könyvtár, amelyet megnézünk, az Pdf2Dom. Kezdjük a Maven-függőségekkel, amelyeket hozzá kell adnunk a projektünkhöz:

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

Az első függőséget fogjuk használni a kiválasztott PDF fájl betöltéséhez. A második függőség maga az átalakításért felelős. A legfrissebb verziók itt találhatók: pdfbox-tools és pdf2dom.

Mi több, mi használni fogjuk iText hogy kivonja a szöveget egy PDF fájlból és POI hogy létrehozza a.docx dokumentum.

Vessünk egy pillantást a Maven-függőségekre, amelyeket be kell építenünk a projektünkbe:

 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 

Az iText legújabb verziója itt található, az Apache POI-t pedig itt keresheti.

3. PDF és HTML konverziók

Az általunk használt HTML fájlokkal való együttműködéshez Pdf2Dom - PDF elemző, amely a dokumentumokat HTML DOM reprezentációvá alakítja. A kapott DOM fa ezután sorosítható egy HTML fájlba, vagy tovább feldolgozható.

A PDF konvertálásához HTML-be kell használnunk az XMLWorker könyvtárat, amelyet a iText.

3.1. PDF-ből HTML-be

Vessünk egy pillantást egy egyszerű konverzióra PDF-ből HTML-be:

private void generálásHTMLFromPDF (String fájlnév) {PDDocument pdf = PDDocument.load (új Fájl (fájlnév)); Írókimenet = new PrintWriter ("src / output / pdf.html", "utf-8"); új PDFDomTree (). writeText (pdf, output); output.close (); } 

A fenti kódrészletbe betöltjük a PDF fájlt, a PDFBox betöltési API segítségével. Betöltött PDF-fájl esetén az elemző segítségével elemezzük a fájlt, és a kimenetre írjuk java.io.író.

Vegye figyelembe, hogy a PDF konvertálása HTML-be soha nem 100% -os pixel-pixel eredmény. Az eredmények az adott PDF fájl összetettségétől és szerkezetétől függenek.

3.2. HTML-ből PDF-be

Most nézzük meg a HTML-ből PDF-be történő konverziót:

private static void generálPDFFromHTML (String fájlnév) {Document document = new Document (); PdfWriter író = PdfWriter.getInstance (dokumentum, új FileOutputStream ("src / output / html.pdf")); document.open (); XMLWorkerHelper.getInstance (). ParseXHtml (író, dokumentum, új FileInputStream (fájlnév)); document.close (); }

Vegye figyelembe, hogy ha a HTML-t konvertálja PDF-be, akkor meg kell győződnie arról, hogy a HTML-n minden címke megfelelően elindult és bezárt, különben a PDF nem jön létre. Ennek a megközelítésnek az a pozitív aspektusa, hogy a PDF pontosan ugyanúgy készül el, mint a HTML fájlban.

4. PDF-képkonverziók

A PDF fájlokat képpé konvertálni számos módon lehet. Az egyik legnépszerűbb megoldást nevezik meg Apache PDFBox. Ez a könyvtár egy nyílt forráskódú Java eszköz a PDF dokumentumok kezeléséhez. Kép-PDF konvertáláshoz használjuk iText újra.

4.1. PDF képpé

A PDF fájlokká történő átalakításának megkezdéséhez az előző szakaszban említett függőséget kell használnunk - pdfbox-tools.

Vessünk egy pillantást a kód példájára:

private void generImageFromPDF (String fájlnév, String kiterjesztés) {PDDocument document = PDDocument.load (új Fájl (fájlnév)); PDFRenderer pdfRenderer = új PDFRenderer (dokumentum); for (int page = 0; page <document.getNumberOfPages (); ++ page) {BufferedImage bim = pdfRenderer.renderImageWithDPI (oldal, 300, ImageType.RGB); ImageIOUtil.writeImage (bim, String.format ("src / output / pdf-% d.% S", 1. oldal, kiterjesztés), 300); } document.close (); }

A fent említett kódban kevés fontos rész található. Használnunk kell PDFRenderer, annak érdekében, hogy a PDF a BufferedImage. Ezenkívül a PDF fájl minden oldalát külön kell megjeleníteni.

Végül használjuk ImageIOUtil, az Apache PDFBox Tools alkalmazásból egy kép megírásához az általunk megadott kiterjesztéssel. A lehetséges fájlformátumok: jpeg, jpg, gif, tiff vagy png.

Ne feledje, hogy az Apache PDFBox egy speciális eszköz - létrehozhatunk saját PDF fájlokat a semmiből, kitölthetünk űrlapokat a PDF fájlokban, aláírhatjuk és / vagy titkosíthatjuk a PDF fájlokat.

4.2. Kép PDF-be

Vessünk egy pillantást a kód példájára:

private static void generálPDFFromImage (String fájlnév, String kiterjesztés) {Document document = new Document (); Karakterlánc bemenet = fájlnév + "." + kiterjesztés; Karakterlánc kimenet = "src / output /" + kiterjesztés + ".pdf"; FileOutputStream fos = új FileOutputStream (output); PdfWriter író = PdfWriter.getInstance (dokumentum, fos); író.nyit (); document.open (); document.add (Image.getInstance ((új URL (bemenet)))); document.close (); író.zárja (); }

Felhívjuk figyelmét, hogy a képet fájlként is megadhatjuk, vagy betölthetjük az URL-ről, amint az a fenti példában látható. Sőt, a kimeneti fájl kiterjesztései, amelyeket használhatunk jpeg, jpg, gif, tiff vagy png.

5. PDF konvertálás szövegre

A nyers szöveg PDF fájlból történő kinyeréséhez mi is felhasználjuk Apache PDFBox újra. Szöveg-PDF konvertáláshoz használni fogjuk iText.

5.1. PDF szöveggé

Hoztunk létre egy nevű módszert generálniTxtFromPDF (…) és megosztottahárom fő részre: a PDF fájl betöltése, a szöveg kibontása és a végső fájl létrehozása.

Kezdjük az alkatrész betöltésével:

Fájl f = új fájl (fájlnév); String parsedText; PDFParser elemző = új PDFParser (új RandomAccessFile (f, "r")); parser.parse ();

A PDF fájl olvasásához használjuk PDFParser, „r” (olvasás) opcióval. Sőt, használnunk kell a parser.parse () módszer, amely a PDF elemzését folyamként elemzi és feltölti a COSDocument tárgy.

Vessünk egy pillantást a kivonatoló szövegrészre:

COSDocument cosDoc = parser.getDocument (); PDFTextStripper pdfStripper = new PDFTextStripper (); PDDocument pdDoc = új PDDocument (cosDoc); parsedText = pdfStripper.getText (pdDoc);

Az első sorban spórolunk COSDocument benne cosDoc változó. Ezután fel fogják használni a konstrukcióhoz PDocument, amely a PDF dokumentum memóriában való ábrázolása. Végül felhasználjuk PDFTextStripper a dokumentum nyers szövegének visszaadásához. Az összes ilyen művelet után használnunk kell Bezárás() módszer az összes használt adatfolyam bezárására.

Az utolsó részben szöveget mentünk az újonnan létrehozott fájlba az egyszerű Java segítségével PrintWriter:

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

Felhívjuk figyelmét, hogy a formázást nem lehet egyszerű szövegfájlban megőrizni, mert az csak szöveget tartalmaz.

5.2. Szöveg PDF-be

A szöveges fájlok konvertálása PDF-be kissé bonyolult. A fájl formázásának fenntartása érdekében további szabályokat kell alkalmaznia.

A következő példában nem vesszük figyelembe a fájl formázását.

Először meg kell határoznunk a PDF fájl, verzió és kimeneti fájl méretét. Vessünk egy pillantást a kód példájára:

Dokumentum pdfDoc = új dokumentum (PageSize.A4); PdfWriter.getInstance (pdfDoc, új FileOutputStream ("src / output / txt.pdf")) .setPdfVersion (PdfWriter.PDF_VERSION_1_7); pdfDoc.open ();

A következő lépésben meghatározzuk a betűtípust és az új bekezdés létrehozásához használt parancsot is:

Font myfont = new Font (); myfont.setStyle (Betűtípus.NORMAL); myfont.setSize (11); pdfDoc.add (új bekezdés ("\ n"));

Végül bekezdéseket fogunk adni az újonnan létrehozott PDF fájlba:

BufferedReader br = new BufferedReader (új FileReader (fájlnév)); String strLine; while ((strLine = br.readLine ())! = null) {Bekezdés para = új Bekezdés (strLine + "\ n", myfont); para.setAlignment (Element.ALIGN_JUSTIFIED); pdfDoc.add (para); } pdfDoc.close (); br.close ();

6. PDF to Docx Conversions

PDF-fájl létrehozása Word-dokumentumból nem könnyű, és itt nem foglalkozunk ezzel a témával. Javasoljuk, hogy harmadik fél könyvtárai tegyék meg jWordConvert.

Microsoft Word fájl PDF-ből történő létrehozásához két könyvtárra lesz szükségünk. Mindkét könyvtár nyílt forráskódú. Az első az iText és a szöveg kivonására szolgál egy PDF fájlból. A második az POI és a.docx dokumentum.

Vessünk egy pillantást a PDF-betöltő rész kódrészletére:

XWPFDocument doc = új XWPFDocument (); Karakterlánc pdf = fájlnév; PdfReader olvasó = new PdfReader (pdf); PdfReaderContentParser parser = új PdfReaderContentParser (olvasó); 

A PDF betöltése után minden oldalt külön el kell olvasnunk és megjelenítenünk kell a ciklusban, majd a kimeneti fájlba kell írnunk:

for (int i = 1; i <= olvasó.getNumberOfPages (); i ++) {TextExtractionStrategy stratégia = parser.processContent (i, új SimpleTextExtractionStrategy ()); Karakterlánc szövege = strategy.getResultantText (); XWPFParagraph p = doc.createParagraph (); XWPFRun run = p.createRun (); run.setText (szöveg); run.addBreak (BreakType.PAGE); } FileOutputStream out = új FileOutputStream ("src / output / pdf.docx"); dok.írja (ki); // Zárjon be minden megnyitott fájlt

Felhívjuk figyelmét, hogy a SimpleTextExtractionStrategy () kibontási stratégia, minden formázási szabályt elveszítünk. Ennek kijavítása érdekében játsszon az itt leírt extrakciós stratégiákkal, hogy összetettebb megoldást érjen el.

7. PDF - X kereskedelmi könyvtárak

Az előző szakaszokban a nyílt forráskódú könyvtárakat ismertettük. Kevés olyan könyvtár van, amelyet érdemes észrevenni, de fizetősek:

  • jPDFImages - A jPDFImages képeket hozhat létre egy PDF dokumentum oldalairól, és exportálhatja JPEG, TIFF vagy PNG képként.
  • JPEDAL - A JPedal egy aktívan fejlesztett és nagyon képes natív Java PDF könyvtár SDK, amelyet fájlok nyomtatására, megtekintésére és konvertálására használnak.
  • pdfcrowd - ez egy újabb Web / HTML-fájl PDF-be és PDF-fájl Web / HTML-konvertáló könyvtár, fejlett GUI-val

8. Következtetés

Ebben a cikkben megvitattuk a módját konvertálja a PDF fájlt különféle formátumokra.

A bemutató teljes megvalósítása megtalálható a GitHub projektben - ez egy Maven-alapú projekt. A teszteléshez egyszerűen futtassa a példákat, és nézze meg az eredményeket a Kimenet mappába.