Как преобразовать документ в 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(); РЕКОМЕНДУЕМЫЕ СТАТЬИ |