Чтение pdf-файлов по одной странице за раз с помощью Java - PullRequest
0 голосов
/ 25 февраля 2009

Я пытаюсь прочитать PDF-документ в приложении j2ee.

Для веб-приложения я должен хранить документы в формате PDF на диске. Чтобы упростить поиск, я хочу сделать обратный индекс текста внутри документа; если это OCR.

С помощью библиотеки PDFbox можно создать объект pdfDocument, содержащий весь файл PDF. Однако, чтобы сохранить память и улучшить общую производительность, я бы предпочел обрабатывать документ как поток и читать по одной странице за раз в буфер.

Интересно, можно ли читать файловый поток, содержащий страницу pdf, страницу за страницей или даже одну строку за раз?

Ответы [ 4 ]

1 голос
/ 17 июля 2017

В версиях 2.0. * Откройте PDF-файл следующим образом:

PDDocument doc = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());

Это установит использование буферизуемой памяти для использования только временных файлов (без основной памяти) без ограничения размера.

Здесь ответили здесь .

1 голос
/ 02 марта 2009

Для данного общего документа PDF у вас нет возможности узнать, где заканчивается одна страница, а другая начинается, по крайней мере, с использованием PDFBox.

Если вас интересует использование ресурсов, я предлагаю вам проанализировать документ pdf в COSDocument, извлечь проанализированные объекты из COSDocument с помощью .getObjects (), который даст вам java.util.List. Это должно быть легко вписаться в любые ваши скудные ресурсы.

Обратите внимание, что вы можете легко конвертировать проанализированные PDF-документы в индексы Lucene через API PDFBox.

Кроме того, прежде чем углубляться в страну оптимизаций, убедитесь, что они действительно вам нужны. PDFBox в состоянии сделать представление в памяти довольно больших документов PDF без особых усилий.

Для анализа документа PDF из InputStream посмотрите COSDocument class

Для написания люценовых индексов посмотрите LucenePDFDocument class

Для представления в памяти COSDocuments, смотрите FDFDocument

0 голосов
/ 19 августа 2010

Посмотрите библиотеку Java PDF Renderer . Я попробовал это сам, и это кажется намного быстрее, чем PDFBox. Однако я не пытался получить текст OCR.

Вот пример, скопированный по ссылке выше, которая показывает, как нарисовать страницу PDF в изображение:

    File file = new File("test.pdf");
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    FileChannel channel = raf.getChannel();
    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    PDFFile pdffile = new PDFFile(buf);

    // draw the first page to an image
    PDFPage page = pdffile.getPage(0);

    //get the width and height for the doc at the default zoom 
    Rectangle rect = new Rectangle(0,0,
            (int)page.getBBox().getWidth(),
            (int)page.getBBox().getHeight());

    //generate the image
    Image img = page.getImage(
            rect.width, rect.height, //width & height
            rect, // clip rect
            null, // null for the ImageObserver
            true, // fill background with white
            true  // block until drawing is done
            );
0 голосов
/ 25 февраля 2009

Я полагаю, вы можете прочитать файл побайтно, разыскивая страницы Строка за строкой сложнее из-за возможных проблем с форматированием PDF.

...