Как конвертировать из PDF в TXT без непреднамеренных разрывов строк?

Я пытаюсь преобразовать очень чистый файл PDF в файл txt, используя python. Я пробовал использовать pyPDF2 и PDFMiner, оба отлично работали при распознавании текста.

Однако, поскольку в PDF строки переносятся, извлеченный файл .txt имеет непреднамеренный разрыв строки в конце: например, строка 1: это отчет о старейшине /n Days, . Между Старшим и днями не должно быть разрыва строки.

текстовый файл

Файл PDF: введите здесь описание изображения

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

Код, который я пробовал (адаптирован из ответа отсюда: преобразование из pdf в текст: строки и слова разбиты)

import io as io
from io import StringIO
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
import os
import sys, getopt

#converts pdf, returns its text content as a string
def convert(fname, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = io.StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(fname, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close
    return text

path='D:\Folder\File.pdf'
a=convert(path)
f=open("D:\Folder\File.txt",'a',encoding='utf-8')
f.write(a)
f.close()

person C.Ann.Sng    schedule 26.05.2021    source источник
comment
Сам файл .pdf отформатирован таким образом? Например, в строке 1 четко виден разрыв строки от Elder до Days.   -  person J. M. Arnold    schedule 26.05.2021
comment
@ Да, файл .pdf представлен таким образом, потому что любой данный абзац должен где-то заканчиваться, а не отображаться в виде очень длинной одиночной строки. Однако, когда я пытаюсь отредактировать это в Acrobat, он фактически возвращается в виде абзаца, а не отдельных строк. Следовательно, я почти уверен, что линия просто обернута, а не сломана.   -  person C.Ann.Sng    schedule 26.05.2021
comment
Можете ли вы просто удалить одиночные разрывы строк, как будто вы хотите сохранить двойные разрывы строк?   -  person JonSG    schedule 26.05.2021
comment
@JonSG Спасибо за комментарий. В документе есть и другие однострочные разрывы, которые я хочу сохранить, поэтому я ищу универсальное решение. Также я видел много дискуссий в Интернете о том, как извлечь из PDF без разрывов строк, и для многих это кажется давно существующей проблемой. Так что думаю другим будет интересно. Есть программное обеспечение, которое включает эту функцию, но мне интересно, можно ли это сделать на python.   -  person C.Ann.Sng    schedule 26.05.2021
comment
Я лучше, мы можем что-то сделать. Помимо Python, как бы вы определили, когда сохранять или отбрасывать разрыв строки?   -  person JonSG    schedule 26.05.2021
comment
@JonSG Итак, скажем, я создал документы из двух слов, A.doc с длинным абзацем, который отображается только как несколько строк из-за переноса строк, и B.doc, где я жестко разбил абзац на отдельные строки, нажав «ввод» (что дайте мне разрыв строки). После этого я сохранил и A, и B в формате pdf. Я надеюсь извлечь текст и получить то же самое из A.pdf и B.pdf - A в виде абзаца и B в виде нескольких строк. В сети видел одно решение - экспортировать PDF из Acrobat Pro в html, чтобы в A.htm не было разрывов строк. Но мне интересно, можно ли это сделать на питоне, так как не на всех ПК есть Acrobat Pro   -  person C.Ann.Sng    schedule 26.05.2021
comment
Но разве однострочные разрывы в исходном документе не равны двум переносам строк? И окончание обычной строки переносится на однострочный разрыв (те, которые вы хотели бы удалить). Таким образом, удаление одного разрыва строки в строке должно решить проблему, не так ли?   -  person J. M. Arnold    schedule 26.05.2021
comment
@ Дж. М. Арнольд. Я понимаю что ты имеешь в виду. Я показал только небольшую часть из 180+ страниц PDF. Есть часть, где он не следует за этим 1 разрывом строки в исходном документе, равным 2 шаблонам разрыва строки, где 1 разрыв строки может равняться 1 разрыву строки или более разрывам строки. ), так как они имеют разный интервал между абзацами.   -  person C.Ann.Sng    schedule 26.05.2021
comment
Вы неправильно диагностируете, что делает Acrobat. Файл PDF — это просто захват распечатки. В нем нет концепции абзацев и предложений, а также переноса слов. Это просто напечатать эту строку в этих координатах X, Y для каждой строки. В конце каждой строки определенно ЕСТЬ разрывы строк. Acrobat просто предполагает, что эти строки составляют абзац из-за их расположения. Вам нужно сделать то же самое, вручную.   -  person Tim Roberts    schedule 27.05.2021


Ответы (1)


Картинка стоит тысячи слов, а комментарии к картинкам не допускаются! Я использую веб-архив другой копии, но Gist точно такой же.

Вы работаете с выравниванием по ширине, но, в отличие от выравнивания по ширине в текстовом процессоре, глифы обычно привязаны к строке с заданной позицией вверх от основания страницы. Adobe работает над PDF-файлами с возможностью перекомпоновки и имеет опыт объединения строк в абзац, однако другие читатели примут</br>
каждую строку такой, какая она есть. </br>

<p stle=indented>Нет маркеров границ абзаца, как, скажем, в HTML <\p>

Читатели в будущем могут быть дополнены, как Acrobat, для объединения строк, но это не нужно для чтения (вслух) по одной строке за раз. Некоторые программы чтения аудио будут заметно заикаться на этих строках во время возврата, в то время как некоторые разумно запрограммированы просто игнорировать их.

введите здесь описание изображения

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

person K J    schedule 26.05.2021