【问题标题】:Cannot parse PDF encoded symbols无法解析 PDF 编码的符号
【发布时间】:2021-10-31 05:42:11
【问题描述】:

我正在尝试遍历 pdf 报告并获取简单的“Param := Value”语句。基本上,这些报告是用 MathCad 编写的测试报告,它们使用这个 := 赋值运算符。到目前为止,我已经能够使用 PDFminer 将参数和值以及其他所有内容转储到 txt 文件中,但所有符号都更改为  或 U 符号。我需要它才能读取 := 并将其用作我的定位器,这样我就可以解析所有设置。

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer

    with open('output.txt', 'a') as file:
        for page_layout in extract_pages("report.pdf"):
            for element in page_layout:
                if isinstance(element, LTTextContainer):
                    file.write(str(element.get_text().encode("unicode-8")))
                    print(element.get_text().encode("unicode-8"))

我也尝试过使用下面第二个这样的 process_page 路由,这给了我一个如下所示的输出,它应该是一组 key:=value 对。

发电机满负荷 当前:\n'b'ZGBASE\n'b'\xef\x80\xba\xef\x80\xbd\n'b'ZGBASE\n'b'\xef\x80\xbd\n'b'1.191 \xce\xa9\n'b'IGen\n'b'\xef\x80\xbd\n'b'7758.14 A\n'b'IGen\n'b'\xef\x80\xba\xef\x80\xbd\n'b'MVAG\n'b'3 KVG\n'b'2\nKVG\nMVAG\n'b'生成器 接地\n'b'比:\n'b'GTR\n'b'\xef\x80\xba\xef\x80\xbd\n'b'14400V

output_string = StringIO()
with open('CHrpt.pdf', 'r') as in_file:
   parser = PDFParser(in_file)
   doc = PDFDocument(parser)
   rsrcmgr = PDFResourceManager()
   device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
            interpreter = PDFPageInterpreter(rsrcmgr, device)
            for page in PDFPage.create_pages(doc):
                 interpreter.process_page(page)
        
with open('hello.txt', 'a') as file:
   file.write(str(output_string.getvalue()), encoding="utf-8")

我们的目标是自动解析这些报告并让它更新我们的设置数据库。我在 Pycharm 2021 中使用 Anaconda3 和 Python 3.8

【问题讨论】:

    标签: python parsing encoding character-encoding pdfminer


    【解决方案1】:

    如果序列 \xef\x80\xba\xef\x80\xbd 看起来是 Unicode 代码点的 UTF-8 编码,那么您看到的是来自 Unicode Private Use Area (PUA) 的两个字符。在 PDF 文档中使用 PUA 字符代码很常见;该文档可能还包括嵌入字体以及这些字符代码的特定渲染。通过仔细检查呈现的 PDF,您可能会发现 := 符号与文档中 := 的其他用法之间的区别。

    PDF 并非设计用于存储信息的机制。它是一种旨在有效存储文档的渲染图像的技术,以便可以在各种媒体上打印或显示而不会影响其外观。保留原始文档的语义从来都不是设计目标,试图提取原始信息的工具都有其局限性。

    话虽如此,如果我在第一段中的分析是正确的,您也许可以通过搜索序列"\uf03a\uf03d" 来解析 PDF 的文本,这似乎是正在使用的一对 Unicode 字符。

    【讨论】:

    • 我不知道如何搜索 PDF 的设置。
    • @AaronDalton:当我说“设置”时,我是在引用你的问题(“我需要这个才能读取 := 并将其用作我的定位器,这样我就可以 解析所有设置。”)我不是在谈论 PDF 的设置。我建议不要搜索 ASCII 字符“:=”,而是在我的答案中搜索 Unicode 字符。我编辑了答案以删除该词,因为它似乎令人困惑。
    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多