【问题标题】:How to convert from PDF to TXT without unintended line breaks?如何在没有意外换行符的情况下从 PDF 转换为 TXT?
【发布时间】:2021-05-27 07:36:36
【问题描述】:

我正在尝试使用 python 将一个非常干净的 PDF 文件转换为 txt 文件。我尝试过使用 pyPDF2 和 PDFMiner,它们在文本识别方面都表现出色。

但是,由于在 PDF 中换行,提取的 .txt 文件在末尾有意外的换行符:例如第 1 行:“is an account of the Elder /n Days,”。 “Elder”和“days”之间不应有换行符。

PDF 文件:

使用 Acrobat 编辑时,可以清楚地看到 PDF 中的原始文本不包含硬换行符,并且可以作为段落而不是单行进行编辑。

我尝试过的代码(改编自这里的答案:convert from pdf to text: lines and words are broken

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()

【问题讨论】:

  • .pdf 文件本身是这样格式化的吗?以第 1 行为例,您可以清楚地看到从“Elder”到“Days”的换行符。
  • @是的,.pdf 文件以这种方式呈现,因为任何给定的段落都需要在某处结束,而不是显示为很长的单行。但是,当我尝试在 Acrobat 上编辑它时,它实际上以段落的形式返回,而不是单行。因此,我很确定这条线只是被包裹,而不是被打破。
  • 你能简单地去掉单行换行符,就好像你想保留双换行符一样?
  • @JonSG感谢您的评论。我想保留文档中的其他单行换行符,所以我正在寻找一个通用的解决方案。我还在网上看到了很多关于如何在没有换行符的情况下从 PDF 中提取的讨论,这对许多人来说似乎是一个长期存在的问题。所以我认为其他人也会对此感兴趣。有软件可以启用这个功能,但我想知道它是否可以在 python 上实现。
  • 我最好我们可以做点什么。除了 Python,您将如何确定何时保留或丢弃换行符?

标签: python python-3.x pdf pypdf2 pdfminer


【解决方案1】:

“一张图抵千言”,cmets不允许图片! 我正在使用不同副本的 Web 存档,但要点完全相同。

您正在处理“对齐”的内容,但与文字处理器中的重排对齐方式不同,字形通常与从页面底部向上设置位置的一行相关联。 Adobe 正在开发可重排的 PDF,并且具有在段落中组合线条的专业知识,但其他读者会接受</br>
每一行都是为了什么。 </br>

<p stle=indented>没有段落边界标记,就像 HTML <\p>中的那样

阅读器将来可能会像杂技演员一样增强,以合并行,但不需要一次读取(大声)一行。一些音频阅读器会在“一次一行”返回时明显结结巴巴,而有些音频阅读器经过智能编程,会简单地忽略它们。

简而言之,您需要添加自己的 AI/正则表达式来收集行和添加缩进,但要注意人类文学的重大差异,例如连字符和东方标点符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多