PDF конверсии в Java

1. Въведение

В тази кратка статия ще се съсредоточим върху програмното преобразуване между PDF файлове и други формати в Java .

По-конкретно ще опишем как да запазвате PDF файлове като файлове с изображения, като PNG или JPEG, да конвертирате PDF файлове в документи на Microsoft Word, да експортирате като HTML и да извличате текстовете, като използвате множество библиотеки с отворен код на Java.

2. Зависимости на Maven

Първата библиотека, която ще разгледаме, е Pdf2Dom . Нека започнем с зависимостите Maven, които трябва да добавим към нашия проект:

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

Ще използваме първата зависимост, за да заредим избрания PDF файл. Втората зависимост е отговорна за самото преобразуване. Най-новите версии можете да намерите тук: pdfbox-tools и pdf2dom.

Нещо повече, ще използваме iText за извличане на текст от PDF файл и POI за създаване на. docx документ.

Нека да разгледаме зависимостите на Maven, които трябва да включим в нашия проект:

 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 

Най-новата версия на iText може да бъде намерена тук, а Apache POI - тук.

3. PDF и HTML конверсии

За да работим с HTML файлове, ще използваме Pdf2Dom - PDF парсер, който преобразува документите в HTML DOM представяне. След това полученото DOM дърво може да бъде сериализирано в HTML файл или допълнително обработено.

За да конвертираме PDF в HTML, трябва да използваме XMLWorker, библиотека, предоставена от iText .

3.1. PDF към HTML

Нека да разгледаме просто преобразуване от PDF в HTML:

private void generateHTMLFromPDF(String filename) { PDDocument pdf = PDDocument.load(new File(filename)); Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); new PDFDomTree().writeText(pdf, output); output.close(); } 

В кодовия фрагмент по-горе зареждаме PDF файла, като използваме API за зареждане от PDFBox. Когато PDF файлът е зареден, ние използваме парсера, за да анализираме файла и да запишем в изхода, посочен от java.io.Writer.

Имайте предвид, че конвертирането на PDF в HTML никога не е резултат от 100%, пиксел към пиксел. Резултатите зависят от сложността и структурата на конкретния PDF файл.

3.2. HTML към PDF

Сега нека да разгледаме преобразуването от HTML в PDF:

private static void generatePDFFromHTML(String filename) { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("src/output/html.pdf")); document.open(); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(filename)); document.close(); }

Имайте предвид, че преобразувайки HTML в PDF, трябва да се уверите, че HTML има всички етикети правилно стартирани и затворени, в противен случай PDF няма да бъде създаден. Положителният аспект на този подход е, че PDF ще бъде създаден по същия начин, както беше в HTML файл.

4. Преобразуване на PDF в изображения

Има много начини за конвертиране на PDF файлове в изображение. Едно от най-популярните решения се нарича Apache PDFBox . Тази библиотека е Java инструмент с отворен код за работа с PDF документи. За преобразуване на изображение в PDF ще използваме отново iText .

4.1. PDF към изображение

За да започнем да конвертираме PDF файлове в изображения, трябва да използваме зависимостта, спомената в предишния раздел - pdfbox-tools .

Нека да разгледаме примера на кода:

private void generateImageFromPDF(String filename, String extension) { PDDocument document = PDDocument.load(new File(filename)); PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI( page, 300, ImageType.RGB); ImageIOUtil.writeImage( bim, String.format("src/output/pdf-%d.%s", page + 1, extension), 300); } document.close(); }

В гореспоменатия код има няколко важни части. Трябва да използваме PDFRenderer , за да визуализираме PDF като BufferedImage . Също така, всяка страница от PDF файла трябва да се изобрази отделно.

И накрая, използваме ImageIOUtil от Apache PDFBox Tools, за да напишем изображение, с указаното от нас разширение. Възможните файлови формати са jpeg, jpg, gif, tiff или png.

Имайте предвид, че Apache PDFBox е усъвършенстван инструмент - ние можем да създаваме свои собствени PDF файлове от нулата, да попълваме формуляри в PDF файл, да подписваме и / или криптираме PDF файла.

4.2. Изображение в PDF

Нека да разгледаме примера на кода:

private static void generatePDFFromImage(String filename, String extension) { Document document = new Document(); String input = filename + "." + extension; String output = "src/output/" + extension + ".pdf"; FileOutputStream fos = new FileOutputStream(output); PdfWriter writer = PdfWriter.getInstance(document, fos); writer.open(); document.open(); document.add(Image.getInstance((new URL(input)))); document.close(); writer.close(); }

Моля, обърнете внимание, че можем да предоставим изображение като файл или да го заредим от URL, както е показано в примера по-горе. Освен това разширенията на изходния файл, които можем да използваме, са jpeg, jpg, gif, tiff или png.

5. Преобразуване от PDF в текст

За да извлечем суровия текст от PDF файл, ще използваме отново Apache PDFBox . За преобразуване на текст в PDF ще използваме iText .

5.1. PDF в текст

Създадохме метод с име generateTxtFromPDF (...) и го разделихмена три основни части: зареждане на PDF файла, извличане на текст и окончателно създаване на файл.

Нека започнем с зареждането на част:

File f = new File(filename); String parsedText; PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); parser.parse();

За да прочетем PDF файл, използваме PDFParser , с опция “r” (четене). Освен това трябва да използваме метода parser.parse () , който ще накара PDF да бъде анализиран като поток и попълнен в обекта COSDocument .

Нека да разгледаме частта за извличане на текст:

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

In the first line, we'll save COSDocument inside the cosDoc variable. It will be then used to construct PDocument, which is the in-memory representation of the PDF document. Finally, we will use PDFTextStripper to return the raw text of a document. After all of those operations, we'll need to use close() method to close all the used streams.

In the last part, we'll save text into the newly created file using the simple Java PrintWriter:

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

Please note that you cannot preserve formatting in a plain text file because it contains text only.

5.2. Text to PDF

Converting text files to PDF is bit tricky. In order to maintain the file formatting, you'll need to apply additional rules.

In the following example, we are not taking into consideration the formatting of the file.

First, we need to define the size of the PDF file, version and output file. Let's have a look at the code example:

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

In the next step, we'll define the font and also the command that is used to generate new paragraph:

Font myfont = new Font(); myfont.setStyle(Font.NORMAL); myfont.setSize(11); pdfDoc.add(new Paragraph("\n"));

Finally, we are going to add paragraphs into newly created PDF file:

BufferedReader br = new BufferedReader(new FileReader(filename)); String strLine; while ((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 to Docx Conversions

Creating PDF file from Word document is not easy, and we'll not cover this topic here. We recommend 3rd party libraries to do it, like jWordConvert.

To create Microsoft Word file from a PDF, we'll need two libraries. Both libraries are open source. The first one is iText and it is used to extract the text from a PDF file. The second one is POI and is used to create the .docx document.

Let's take a look at the code snippet for the PDF loading part:

XWPFDocument doc = new XWPFDocument(); String pdf = filename; PdfReader reader = new PdfReader(pdf); PdfReaderContentParser parser = new PdfReaderContentParser(reader); 

After loading of the PDF, we need to read and render each page separately in the loop, and then write to the output file:

for (int i = 1; i <= reader.getNumberOfPages(); i++) { TextExtractionStrategy strategy = parser.processContent(i, new SimpleTextExtractionStrategy()); String text = strategy.getResultantText(); XWPFParagraph p = doc.createParagraph(); XWPFRun run = p.createRun(); run.setText(text); run.addBreak(BreakType.PAGE); } FileOutputStream out = new FileOutputStream("src/output/pdf.docx"); doc.write(out); // Close all open files

Please note, that with the SimpleTextExtractionStrategy() extraction strategy, we'll lose all formatting rules. In order to fix it, play with extraction strategies described here, to achieve a more complex solution.

7. PDF to X Commercial Libraries

В предишните раздели описахме библиотеки с отворен код. Има още няколко библиотеки, които си заслужават да бъдат забелязани, но те са платени:

  • jPDFImages - jPDFImages може да създава изображения от страници в PDF документ и да ги експортира като JPEG, TIFF или PNG изображения.
  • JPEDAL - JPedal е активно разработен и много способен естествен Java PDF PDF библиотека SDK, използвана за печат, преглед и конвертиране на файлове
  • pdfcrowd - това е друга уеб / HTML в PDF и PDF в Web / HTML библиотека за преобразуване, с усъвършенстван GUI

8. Заключение

В тази статия обсъдихме начините за конвертиране на PDF файл в различни формати .

Пълното изпълнение на този урок може да се намери в проекта GitHub - това е проект, базиран на Maven. За да тествате, просто изпълнете примерите и вижте резултатите в изходната папка.