如何使用 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 标签? 的相关文章

  • 围绕 readline 构建的 python 批处理的触发器选项卡完成

    背景 我有一个 python 程序 它导入并使用 readline 模块来构建自制的命令行界面 我有第二个 python 程序 围绕 Bottle 一个 Web 微框架构建 充当该 CLI 的前端 第二个 python 程序向第一个程序打开
  • Python中Decimal类型的澄清

    每个人都知道 或者至少 每个程序员都应该知道 http docs oracle com cd E19957 01 806 3568 ncg goldberg html 即使用float类型可能会导致精度错误 然而 在某些情况下 精确的解决方
  • 如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

    我在 Cloud9 中使用 Python AWS CDK 并且我部署简单的 Lambda 函数那应该是发送 API 请求到 Atlassian 的 API当对象上传到 S3 存储桶时 也是由 CDK 创建的 这是我的 CDK 堆栈代码 fr
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • 将 matplotlib 颜色图集中在特定值上

    我正在使用 matplotlib 颜色图 seismic 绘制绘图 并且希望白色以 0 为中心 当我在不进行任何更改的情况下运行脚本时 白色从 0 下降到 10 我尝试设置 vmin 50 vmax 50 但在这种情况下我完全失去了白色 关
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • 在 Pandas 中使用正则表达式的多种模式

    我是Python编程的初学者 我正在探索正则表达式 我正在尝试从 描述 列中提取一个单词 数据库名称 我无法给出多个正则表达式模式 请参阅下面的描述和代码 描述 Summary AD1 Low free DATA space in data
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 如何为每个屏幕添加自己的 .py 和 .kv 文件?

    我想为每个屏幕都有一个单独的 py 和 kv 文件 应通过 main py main kv 中的 ScreenManager 选择屏幕 设计应从文件 screen X kv 加载 类等应从文件 screen X py 加载 Screens
  • Python 无法使用套接字绑定我的外部/公共 IP 地址,给出错误但是当使用本地 IP 地址时,错误不会显示

    这是出现主要错误的代码 与我的本地 IP 的绑定将起作用 s bind 192 168 1 4 port 与我的公共 IP 的绑定失败并出现以下错误 s bind 99 99 99 99 port WinError 10049 请求的地址在
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐