Как преобразовать документ в PDF в Java?
В программных проектах довольно часто требуется преобразование данного файла (HTML/TXT/и т. д.) в файл PDF, и аналогичным образом любой файл PDF необходимо преобразовать в файлы HTML/TXT и т. д. Даже PDF-файлы необходимо хранить в виде изображений типа PNG или GIF и т. д. В примере проекта maven давайте посмотрим то же самое. Поскольку это проект maven, необходимые зависимости необходимо добавить в pom.xml.
Основная библиотека — это PDF2Dom:
<!-- To load the selected PDF file -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.25</version>
</dependency>
<!-- To load the selected PDF file -->
<!-- Required for conversion -->
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>pdf2dom</artifactId>
<version>2.0.1</version>
</dependency>Также необходимы еще несколько зависимостей. iText необходим для извлечения текста из заданного PDF-файла. POI необходим для создания документа .docx.
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.15</version>
</dependency>Пример проекта Maven
Давайте начнем со структуры проекта и pom.xml, а затем будем искать необходимый исходный код для преобразования из PDF в другие форматы, а также из других форматов в HTML.
пом.xml
XML
<?xml version="1.0"?> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 <modelVersion>4.0.0</modelVersion> <artifactId>pdf</artifactId> <name>pdf</name> <parent> <groupId>com.gfg</groupId> <artifactId>parent-modules</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>${pdfbox-tools.version}</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>net.sf.cssbox</groupId> <artifactId>pdf2dom</artifactId> <version>${pdf2dom.version}</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>${itextpdf.version}</version> </dependency> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>${xmlworker.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>${poi-scratchpad.version}</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-transcoder</artifactId> <version>${batik-transcoder.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi-ooxml.version}</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>${thymeleaf.version}</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>${flying-saucer-pdf.version}</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-openpdf</artifactId> <version>${flying-saucer-pdf-openpdf.version}</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>${jsoup.version}</version> </dependency> <dependency> <groupId>com.openhtmltopdf</groupId> <artifactId>openhtmltopdf-core</artifactId> <version>${open-html-pdf-core.version}</version> </dependency> <dependency> <groupId>com.openhtmltopdf</groupId> <artifactId>openhtmltopdf-pdfbox</artifactId> <version>${open-html-pdfbox.version}</version> </dependency> </dependencies> <build> <finalName>pdf</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <properties> <pdfbox-tools.version>2.0.25</pdfbox-tools.version> <pdf2dom.version>2.0.1</pdf2dom.version> <itextpdf.version>5.5.10</itextpdf.version> <xmlworker.version>5.5.10</xmlworker.version> <poi-scratchpad.version>3.15</poi-scratchpad.version> <batik-transcoder.version>1.8</batik-transcoder.version> <poi-ooxml.version>3.15</poi-ooxml.version> <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version> <flying-saucer-pdf.version>9.1.20</flying-saucer-pdf.version> <open-html-pdfbox.version>1.0.6</open-html-pdfbox.version> <open-html-pdf-core.version>1.0.6</open-html-pdf-core.version> <flying-saucer-pdf-openpdf.version>9.1.22</flying-saucer-pdf-openpdf.version> <jsoup.version>1.14.2</jsoup.version> </properties> </project> |
Давайте посмотрим важные ключевые файлы
1. Преобразование PDF и HTML
ПреобразованиеPDF2HTMLExample.java
В приведенной ниже программе оба метода обрабатываются, т.е.
a. generationOfHTMLFromPDF
Note: Conversion of PDF to HTML cannot be predicted 100%, pixel-to-pixel result oriented. If the complexity of the PDF file is more, accuracy varies.
b. generationOfPDFFromHTML
Note: In html file, all tags need to properly closed and then only PDF can be generated
Java
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.io.Writer; import javax.xml.parsers.ParserConfigurationException; import org.apache.pdfbox.pdmodel.PDDocument;import org.fit.pdfdom.PDFDomTree; import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerHelper; public class ConversionOfPDF2HTMLExample { private static final String PDF = "src/main/resources/pdf.pdf"; private static final String HTML = "src/main/resources/html.html"; public static void main(String[] args) { try { generationOfHTMLFromPDF(PDF); generationOfPDFFromHTML(HTML); } catch (IOException | ParserConfigurationException | DocumentException e) { e.printStackTrace(); } } private static void generationOfHTMLFromPDF(String filename) throws ParserConfigurationException, IOException { PDDocument pdf = PDDocument.load(new File(filename)); PDFDomTree parser = new PDFDomTree(); Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); parser.writeText(pdf, output); output.close(); if (pdf != null) { pdf.close(); } } private static void generationOfPDFFromHTML(String filename) throws ParserConfigurationException, IOException, DocumentException { 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(); }} |
2. Преобразование PDF и изображений
PDF можно преобразовать в изображения разными способами, и одним из важных способов является то, что Apache PDFBox снова может быть преобразован из изображения в PDF с помощью iText.
Преобразование PDF2ImageExample.java
В приведенной ниже программе обрабатываются следующие методы
- генерацияOfPDFFromImage
- Изображения имеют формат jpeg, jpg, gif, tiff или png и могут быть загружены с диска.
- GenerationOfImageFromPDF
- Apache PDFBox — это продвинутый инструмент. Каждая страница PDF должна отображаться с помощью PDFRenderer как BufferedImage. Затем ImageIOUtil используется для записи изображения таких типов, как JPEG, GIF, PNG и т. д.,
Java
import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.net.URL; import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.rendering.ImageType;import org.apache.pdfbox.rendering.PDFRenderer;import org.apache.pdfbox.tools.imageio.ImageIOUtil; import com.itextpdf.text.BadElementException;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Image;import com.itextpdf.text.pdf.PdfWriter; public class ConversionOfPDF2ImageExample { private static final String PDF = "src/main/resources/pdf.pdf"; private static final String JPG = "http://cdn2.gfg.netdna-cdn.com/wp-content/uploads/2016/05/gfg-rest-widget-main-1.2.0"; public static void main(String[] args) { try { generationOfImageFromPDF(PDF, "png"); generationOfImageFromPDF(PDF, "jpeg"); generationOfImageFromPDF(PDF, "gif"); generationOfPDFFromImage(JPG, "jpg"); generationOfPDFFromImage(GIF, "gif"); } catch (IOException | DocumentException e) { e.printStackTrace(); } } private static void generationOfImageFromPDF(String filename, String extension) throws IOException { 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(); } private static void generationOfPDFFromImage(String filename, String extension) throws IOException, BadElementException, DocumentException { 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();РЕКОМЕНДУЕМЫЕ СТАТЬИ |