Есть ли способ читать файлы PDF построчно?

У меня есть файл PDF более 100 страниц. Есть поля и столбцы текста. Когда я извлекаю текст с помощью PyPdf2 и синтаксического анализатора tika, я получаю строку данных, которая не соответствует порядку. Во многих случаях он упорядочен по столбцам, а в других случаях пропускается по всему документу. Можно ли читать pdf-файл, начиная сверху, двигаясь слева направо до низа? Я хочу прочитать текст в столбцах и полях, но я хочу, чтобы строка текста отображалась так, как если бы она читалась слева направо.

Я пробовал: PyPDF2 — единственный инструмент — extracttext(). Быстрый, но не дает пробелов в элементах. Результаты смешаны.

Pdfminer — метод PDFPageInterpeter() с LAParams. Это работает хорошо, но медленно. Не менее 2 секунд на страницу и у меня 200 страниц.

pdfrw - это говорит мне только о количестве страниц.

tabula_py - дает только первую страницу. Может я не правильно зацикливаю.

tika - то, с чем я сейчас работаю. Быстрее и читабельнее, но содержимое по-прежнему беспорядочно.

from tkinter import filedialog
import os
from tika import parser
import re

# select the file you want 
file_path = filedialog.askopenfilename(initialdir=os.getcwd(),filetypes=[("PDF files", "*.pdf")])
print(file_path) # print that path
file_data = parser.from_file(file_path) # Parse data from file
text = file_data['content'] # Get files text content
by_page = text.split('... Information') # split up the document into pages by string that always appears on the
                                    # top of each page

for i in range(1,len(by_page)): # loop page by page
    info = by_page[i] # get one page worth of data from the pdf
    reformated = info.replace("\n", "&") # I replace the new lines with     "&" to make it more readable
    print("Page: ",i) # print page number
    print(reformated,"\n\n") # print the text string from the pdf

Это обеспечивает своего рода вывод, но он не упорядочен так, как мне хотелось бы. Я хочу, чтобы PDF-файл читался слева направо. Кроме того, если бы я мог получить чистое решение на Python, это было бы бонусом. Я не хочу, чтобы мои конечные пользователи были вынуждены устанавливать java (я думаю, что методы tika и tabula-py зависят от java).


person Thomas Weeks    schedule 14.06.2019    source источник
comment
Это, вероятно, не так просто, так как вам нужно будет выполнить анализ макета PDF и соответствующим образом отсортировать текст. В PDF текст, появляющийся в конце страницы, может быть помещен в начало потока содержимого. Таким образом, результаты, скорее всего, не перемешаны, они просто отображаются в файле PDF. Другое дело, как они представлены на экране.   -  person Philipp    schedule 14.06.2019
comment
Проверьте pypi.org/project/pdfminer.   -  person Shanavas M    schedule 14.06.2019
comment
Как сказал Филипп, извлечение текста в естественном порядке чтения из PDF-файла намного сложнее, чем вы могли ожидать. Почему для вас важно извлечение текста в порядке чтения? Что вы делаете с выводом?   -  person Ryan    schedule 15.06.2019
comment
Порядок, в котором появляются данные, сам по себе дает мне информацию. В pdf размещение данных говорит мне, что это такое. Я теряю эту информацию в беспорядке преобразования PDF. Я был довольно находчив, извлекая необходимую информацию из преобразованной строки, но я не уверен, что смогу получить всю необходимую мне информацию. Чтобы ответить на ваш вопрос, я использую данные для создания CSV-файла. Этот файл csv будет прочитан моей программой python и установлен в базу данных.   -  person Thomas Weeks    schedule 15.06.2019


Ответы (1)


Я сделал это для .docx с помощью этого кода. Где txt — это .docx. Надеюсь, это поможет ссылка

import re
pttrn = re.compile(r'(\.|\?|\!)(\'|\")?\s')
new = re.sub(pttrn, r'\1\2\n\n', txt)

print(new)
person Syafiqur__    schedule 14.06.2019
comment
Это создало некоторые разрывы в тексте. Результат по-прежнему находится в том же порядке (перемешанном), за исключением некоторых разрывов строк. Предложенный вами код не читает страницу PDF построчно. - person Thomas Weeks; 17.06.2019