Как преобразовать документ в PDF в Java?

Опубликовано: 20 Февраля, 2023

В программных проектах довольно часто требуется преобразование данного файла (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 
                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>pdf</artifactId>
    <name>pdf</name>
    <url>http://maven.apache.org</url>
  
    <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 GIF = "https://media.giphy.com/media/l3V0x6kdXUW9M4ONq/giphy";
  
    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();
<