PDF преобразования в Java

PDF преобразования в Java

1. Вступление

В этой быстрой статье мы сосредоточимся на алгоритмических продажахconversion between PDF files and other formats in Java.

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

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

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


    org.apache.pdfbox
    pdfbox-tools
    2.0.3


    net.sf.cssbox
    pdf2dom
    1.6

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

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

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


    com.itextpdf
    itextpdf
    5.5.10


    com.itextpdf.tool
    xmlworker
    5.5.10


    org.apache.poi
    poi-ooxml
    3.15


    org.apache.poi
    poi-scratchpad
    3.15

Последнюю версию iText можно найтиhere, и вы можете найти Apache POIhere.

3. Преобразование PDF и HTML

Для работы с файлами HTML мы будем использоватьPdf2Dom - анализатор PDF, который преобразует документы в представление HTMLDOM. Затем полученное дерево 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.

Обратите внимание, чтоconverting PDF to HTML is never a 100%, pixel-to-pixel result. Результаты зависят от сложности и структуры конкретного файла 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();
}

Обратите внимание, чтоconverting HTML to PDF, you need to ensure that HTML has all tags properly started and closed, otherwise the PDF will be not created. Положительным аспектом этого подхода является то, что PDF будет создан точно так же, как и в HTML-файле.

4. PDF to Image Conversionsс

Есть много способов конвертировать 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..

Note that Apache PDFBox is an advanced tool - мы можем создавать наши собственные файлы 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();
}

Please note, that we can provide an image as a file, or load it from URL, as it is shown in the example above. Более того, мы можем использовать расширения выходного файлаjpeg, jpg, gif, tiff илиpng.

5. PDF to Text Conversionsс

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

В последней части мы сохраним текст во вновь созданном файле, используя простой JavaPrintWriter:

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

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

5.2. Текст в PDF

Конвертировать текстовые файлы в PDF немного сложно. In order to maintain the file formatting, you’ll need to apply additional rules.с

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

Во-первых, нам нужно определить размер файла 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 to Docx Conversionsс

Создать 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() мы потеряем все правила форматирования. Чтобы исправить это, поиграйте со стратегиями извлечения, описаннымиhere, чтобы получить более сложное решение.

7. PDF to X Commercial Librariesс

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

  • jPDFImages - jPDFImages может создавать изображения со страниц документа PDF и экспортировать их как изображения JPEG, TIFF или PNG.

  • JPEDAL - JPedal - это активно разрабатываемый и очень мощный SDK для библиотеки Java PDF, используемый для печати, просмотра и преобразования файлов.

  • pdfcrowd - это еще одна библиотека преобразования Web / HTML в PDF и PDF в Web / HTML с расширенным графическим интерфейсом.

8. Conclusionс

В этой статье мы обсудили способы полученияconvert PDF file into various formats.

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