Python3 - Определение изменений макета между двумя файлами - PullRequest
0 голосов
/ 25 июня 2019

В настоящее время я пытаюсь создать анализатор таблиц файлов PDF, в котором пользователи могут определять столбчатые столбцы в файле PDF, а затем извлекать текст PDF в «координатах столбца».

Чтобы извлечьтекст всего файла PDF, я использую pdftotext как: (пример invoice.pdf файл)

pdftotext -f 1 -l 1 invoice.pdf -layout -l

Генерирует:

Invoice #100                                           
Document Date:         26/05 - 2019
                       www.domain.com

Чтобы извлечь определенную часть страницы (в соответствии с координатами моего столбца), я использую:

pdftotext -f 1 -l 1 -x 0 -y 100 -W 200 -H 300 invoice.pdf -layout -

Какие координаты для всего после:

Invoice #100
Document Date: 

Итак, вышеприведенная команда генерирует:

26/05 - 2019
www.domain.com

Выше работает, как вы можете видеть.Он успешно извлекает текст из моего файла PDF (а также текст в координатах).

Форматирование сохраняется, если я запускаю команду pdftotext без -x -y -W -H координат, ноон не сохраняет весь формат документа, если я использую координаты (что имеет смысл, поскольку он смотрит только на определенную часть страницы).

Однако я пытаюсь создать анализатор текста длявывод текста, и для этого мне нужно сохранить форматирование.

Как вы можете видеть в моем исходном файле PDF, строка 26/05 - 2019 фактически начинается со строки 2 - но когда я извлекаю текст, используя координаты, выходные данные показывают его в 1-й строке.

Мне было интересно, есть ли способ обойти это?

Я думал что-то вроде сравнения исходного текстового вывода с выводом, имеющим координаты, а затем только берет свойства форматирования (разрывы строк) из исходного текстового вывода и добавляет егоко второму текстовому выводу.

В настоящее время этот код генерирует вывод в моем скрипте Python:

    column = defaultdict(list)
    COLUMNS = [...]

    for i, col in enumerate(COLUMNS):

         cmd = ['pdftotext', ...]

         proc = subprocess.Popen(
         cmd, stdout=subprocess.PIPE, bufsize=0, text=True)
         out, err = proc.communicate()

    for line in out.splitlines():
        column[0].append({"row": str(line)})

, который в основном просто добавляет каждую строку в список.

...