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. Чтобы протестировать, просто запустите примеры и посмотрите результаты в выходной
папке.