【问题标题】:How to extract a PDF's text using pdfrw如何使用 pdfrw 提取 PDF 的文本
【发布时间】:2017-02-07 11:07:52
【问题描述】:

pdfrw 可以从文档中提取文本吗?

我在想一些类似的事情

from pdfrw import PdfReader
doc = PdfReader(pdf_path)
page_texts = []
for page_nr in doc.numPages:
    page_texts.append(doc.getPage(page_nr).parse_page())  # ..or something

【问题讨论】:

    标签: python-3.5 pdfrw


    【解决方案1】:

    取决于应用于page.Contents.stream 的过滤器。如果只是 FlateDecode 可以使用pdfrw.uncompress.uncompress([page.Contents]) 解码。

    注意:将列表中的整个 Contents 对象提供给函数

    注意:这和pdfrw.PdfReader.uncompress()不一样

    然后你必须解析字符串来找到你的文本。它将位于圆括号内以“TJ”或“Tj”结尾的行上的 BT(开始文本)和 ET(结束文本)标记之间的行块中。

    【讨论】:

    • 您缺少很多关键步骤。您需要处理 PDF 中的字体(TJ 运算符可以直接引用字形索引,然后您不知道哪个 unicode 字符映射到哪个字形)。您还需要解析其他指令(例如那些操纵转换矩阵的指令)以跟踪 where 文本正在绘制。因为不需要按顺序呈现 PDF 中的文本。
    【解决方案2】:

    docs 中解释如何提取文本。但是,它只是一个字节流。您可以遍历页面并单独对其进行解码。

    from pdfrw import PdfReader
    doc = PdfReader(pdf_path)
    for page in doc.pages:
        bytestream = page.Contents.stream # This is a string with bytes, Not a bytestring
        string = #somehow decode bytestream. Maybe using zlib.decompress
        # do something with that text
    

    编辑: 根据author,由于其复杂性,pdfrw 尚不支持文本解压缩可能毫无价值。

    【讨论】:

    • zlib.decompress(stream.encode("latin1"))(虽然stream返回一个字符串是奇怪的API)
    • 请记住,解码内容流与实际提取文本不同。内容流包含呈现文本的 postscript 运算符。这意味着即使您解码内容流,您仍然需要解析这些指令以确定哪些字形在哪个位置呈现。此解决方案并没有真正让您更接近从 PDF 中获取文本。
    【解决方案3】:

    这是一个可能有用的例子:

    for pg_num in range(number_of_pages):
    
        pg_obj = pdfreader.getPage(pg_num)
    
        print(pg_num)
    
        if re.search(r'CSE', pg_obj.extractText()):
            cse_count+= 1
            pdfwriter.addPage(pg_obj)
    

    此处extractText() 将提取包含关键字 CSE 的页面文本

    【讨论】:

    • 方法 extractText() 确实来自包 PyPDF2,正如 Susovan Dey 所提到的。此方法在 pdfrw 中不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多