как использовать PDDocument.loadNonSeq, метод удаления/анализа текста большого pdf

У меня есть несколько вопросов о парсинге pdf и как:

  1. какова цель использования

PDDocument.loadNonSeq метод, который включает в себя временный файл?

  1. У меня есть большой PDF-файл, и мне нужно его разобрать и получить текстовое содержимое. Я использую PDDocument.load(), а затем PDFTextStripper для извлечения данных страница за страницей (у pdfstripper есть setStartPage(n) и setEndPage(n), где n=n+1 каждый цикл страницы). Является ли более эффективным для памяти использование loadNonSeq вместо загрузки?

Например

File pdfFile =  new File("mypdf.pdf");
File tmp_file =  new File("result.tmp");
PDDocument doc = PDDocument.loadNonSeq(pdfFile, new RandomAccessFile(tmp_file, READ_WRITE));
int index=1;
int numpages = doc.getNumberOfPages();
for (int index = 1; index <= numpages; index++){
  PDFTextStripper stripper = new PDFTextStripper();
        Writer destination = new StringWriter();
        String xml="";
        stripper.setStartPage(index);
        stripper.setEndPage(index);
        stripper.writeText(this.doc, destination);
.... //filtering text and then convert it in xml
}

Является ли этот код выше правильного использования loadNonSeq и является ли хорошей практикой чтение PDF-страницы за страницей без большого объема памяти? Я использую чтение страницы за страницей, потому что мне нужно писать текст в XML, используя память DOM (используя метод зачистки, я решаю создать XML для каждой страницы)


person robyp7    schedule 09.10.2015    source источник


Ответы (1)


  1. какова цель использования метода PDDocument.loadNonSeq, который включает временный файл?

PDFBox реализует два способа чтения файла PDF.

  • loadNonSeq это способ загрузки документов
  • load - это способ загрузки документов, но можно попытаться восстановить файлы с неработающими перекрестными ссылками таким образом.

В ветке разработки 2.0.0 алгоритм, ранее использовавшийся для loadNonSeq, теперь используется для load, а алгоритм, ранее использовавшийся для load, больше не используется.

  1. У меня есть большой PDF-файл, и мне нужно его разобрать и получить текстовое содержимое. Я использую PDDocument.load(), а затем PDFTextStripper для извлечения данных страница за страницей (у pdfstripper есть setStartPage(n) и setEndPage(n), где n=n+1 каждый цикл страницы). Является ли более эффективным для памяти использование loadNonSeq вместо load?

Использование loadNonSeq вместо load может улучшить использование памяти для PDF-файлов с несколькими версиями, поскольку он считывает только объекты, на которые все еще есть ссылки из справочной таблицы, в то время как load может хранить больше в памяти.

Однако я не знаю, имеет ли большое значение использование рабочего файла.

рекомендуется ли читать PDF страницу за страницей без большого объема памяти?

Внутренне PDFBox также анализирует заданный диапазон страницу за страницей. Таким образом, если вы обрабатываете вывод стриппера постранично, его, безусловно, можно анализировать постранично.

person mkl    schedule 15.10.2015