Перейти к основному содержимому

Преобразование PDF в Java

· 7 мин. чтения

1. Введение

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

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

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

Первая библиотека, которую мы рассмотрим, — это Pdf2Dom . Давайте начнем с зависимостей Maven, которые нам нужно добавить в наш проект:

<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.25</version>
</dependency>
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>pdf2dom</artifactId>
<version>2.0.1</version>
</dependency>

Мы собираемся использовать первую зависимость для загрузки выбранного файла PDF. Вторая зависимость отвечает за само преобразование. Последние версии можно найти здесь: pdfbox-tools и pdf2dom .

Более того, мы будем использовать iText для извлечения текста из файла PDF и POI для создания файла . документ docx .

Давайте посмотрим на зависимости Maven, которые нам нужно включить в наш проект:

<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>

Последнюю версию iText можно найти здесь, а POI Apache — здесь .

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);

В первой строке мы сохраним COSDocument внутри переменной cosDoc . Затем он будет использоваться для создания PDocument , который является представлением PDF-документа в памяти. Наконец, мы будем использовать PDFTextStripper для возврата необработанного текста документа. После всех этих операций нам нужно будет использовать метод close() , чтобы закрыть все используемые потоки .

В последней части мы сохраним текст во вновь созданный файл с помощью простого Java PrintWriter :

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

Обратите внимание, что вы не можете сохранить форматирование в текстовом файле, поскольку он содержит только текст.

5.2. Текст в PDF

Преобразование текстовых файлов в PDF немного сложно. Чтобы сохранить форматирование файла, вам необходимо применить дополнительные правила.

В следующем примере мы не учитываем форматирование файла.

Во-первых, нам нужно определить размер файла PDF, версию и выходной файл. Давайте посмотрим на пример кода:

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

На следующем шаге мы определим шрифт, а также команду, которая используется для создания нового абзаца:

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

Наконец, мы собираемся добавить абзацы во вновь созданный файл PDF:

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 в Docx

Создать файл PDF из документа Word непросто, и мы не будем здесь затрагивать эту тему. Мы рекомендуем для этого сторонние библиотеки, например jWordConvert .

Чтобы создать файл Microsoft Word из PDF, нам понадобятся две библиотеки. Обе библиотеки имеют открытый исходный код. Первый — iText , и он используется для извлечения текста из файла PDF. Второй — POI и используется для создания файла . документ docx .

Давайте посмотрим на фрагмент кода для части загрузки PDF:

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

После загрузки PDF нам нужно читать и отображать каждую страницу отдельно в цикле, а затем записывать в выходной файл:

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

Обратите внимание, что при использовании стратегии извлечения SimpleTextExtractionStrategy() мы потеряем все правила форматирования. Чтобы это исправить, поиграйте с описанными здесь стратегиями извлечения , чтобы добиться более сложного решения.

7. PDF в коммерческие библиотеки X

В предыдущих разделах мы описали библиотеки с открытым исходным кодом. Есть еще несколько библиотек, заслуживающих внимания, но они платные:

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

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

В этой статье мы обсудили способы преобразования файла PDF в различные форматы .

Полную реализацию этого руководства можно найти в проекте GitHub — это проект на основе Maven. Чтобы протестировать, просто запустите примеры и посмотрите результаты в выходной папке.