如何使用 Python 提取与内容相关的所有 PDF 标签?

2024-02-04

我间接阅读过有关带标签的 PDF 的信息TabbyPDF:基于 Web 的 PDF 表格提取系统 https://www.researchgate.net/publication/327269137_TabbyPDF_Web-Based_System_for_PDF_Table_Extraction_24th_International_Conference_ICIST_2018_Vilnius_Lithuania_October_4-6_2018_Proceedings听起来好像可以获取 PDF 内容的语义信息。因此,不仅是作者/标题/页数,还可能是章节或标题所在的位置。

这可能吗?

以下是一些要显示的 PDF 示例(以防万一):

  • Lorem Ipsum 表测试 https://github.com/MartinThoma/algorithms/blob/master/PDF/PDF-export-example.pdf
  • 卡米洛特边缘 TOL https://github.com/camelot-dev/camelot/blob/master/tests/files/edge_tol.pdf

我尝试过的

我可能会走完全错误的方向,但我得到的信息只是文档的元数据。不是它的内容/内容结构。我希望有类似语义 HTML 元素的东西,我知道有两个部分、一个表格、三个段落。甚至可能该表有标题、42 行和 123 列。

PyPDF2

from PyPDF2 import PdfFileReader


def get_info(path):
    with open(path, "rb") as f:
        pdf = PdfFileReader(f)
        info = pdf.getDocumentInfo()
        nb_pages = pdf.getNumPages()
    info = dict(info)
    info['nb_pages'] = nb_pages
    return info


if __name__ == "__main__":
    path = "PDF-export-example.pdf"
    info = get_info(path)
    for key, value in sorted(info.items()):
        print(f"{key:<15}: {value}")

Lorem Ipsum 表测试:

/Author        : Martin Thoma
/CreationDate  : D:20200730020133-07'00'
/Creator       : Microsoft Word
/ModDate       : D:20200730020133-07'00'
nb_pages       : 1

卡米洛特边缘 TOL:

/Producer      : PyPDF2
nb_pages       : 1 

pdfminer

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument


def get_info(path):
    with open(path, "rb") as f:
        parser = PDFParser(f)
        doc = PDFDocument(parser)
    return doc.info


if __name__ == "__main__":
    path = "edge_tol.pdf"
    info = get_info(path)
    for el in info:
        for key, value in el.items():
            print(f"{key:<15}: {value}")

Lorem Ipsum 表测试:

Author         : b'Martin Thoma'
Creator        : b'Microsoft Word'
CreationDate   : b"D:20200730020133-07'00'"
ModDate        : b"D:20200730020133-07'00'"

卡米洛特边缘 TOL:

Producer       : b'PyPDF2'

我不知道你提到的工具,但我可以回答这背后的理论,这可能会为你指明正确的方向。

您所做的只是获取元数据,并且仅获取其中的一小部分,更准确地说,是从 PDF 中的文档信息字典中得出的部分。虽然它仍然包含一些信息,但它在很大程度上已被 PDF 中嵌入的 XMP 信息(基本上是“简单”XML 信息)的使用所取代。然而,这也与寻找结构化信息无关。

首先,PDF 文件不必包含您所描述的结构信息。这是一个可选功能,大多数(几乎所有)PDF 文档都忽略了它。仅在某些情况下才强制要求在 PDF 中使用结构:

  • 当 PDF 符合长期存档的 ISO 标准 (PDF/A) 时,并且仅当 PDF 希望符合该标准的更严格形式(PDF/A-1a、PDF/A-2a)时或 PDF/A-3a)。
  • 当 PDF 符合通用辅助功能 ISO 标准 (PDF/UA) 时。

在这些情况下,您感兴趣的信息将用于识别页面内容的结构。这通常包括:

  • 定义页面上元素的顺序(PDF 文件可能以完全不合逻辑的顺序包含文本)。结构信息将帮助您找出哪个文本首先出现,然后是其他位。
  • 定义元素的性质(这是图像、标题、段落、人工制品、表格、脚注等...)。

如果您想提取此内容,我建议您阅读Adobe 网站上的 PDF 规范 https://www.adobe.com/devnet/pdf/pdf_reference.html,特别是有关标记内容 (14.6)、逻辑结构 (14.7) 和标记 PDF (14.8) 的章节。 PDF 中信息的编码方式绝非微不足道,正如我所说,大多数 PDF 文件可能不包含该信息。

根据我的经验,唯一以完全正确的方式拥有此功能的 PDF 文件是由有法律义务支持可访问性的组织(政府等)或在其电子档案中使用其中一些功能的组织生成的。一些 OCR 工具可以自动生成“一些”信息,尽管这种情况下的质量可能会低于标准。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python 提取与内容相关的所有 PDF 标签? 的相关文章

随机推荐