python - 通过 OCG(按层)从 PDF 中提取几何元素
问题描述
所以我在这个问题上花了一个月的大部分时间。我正在寻找一种从由文件的 OCG(可选内容组)组织的矢量化 PDF 中提取几何元素(折线、文本、弧线等)的方法,这些 OCG 基本上是 PDF 图层。使用 PDFminer 我能够提取几何图形(LTCurves、LTTextBoxes、LTLines 等);使用 PyPDF2,我能够查看 PDF 中有多少 OCG,尽管我无法访问与该 OCG 关联的几何图形。我在网上看到并尝试了一些 hacky 脚本,它们可能能够解决这个问题,但无济于事。我什至求助于在文本编辑器中打开原始 PDF 数据,并半危险地删除其中的一部分,看看我是否能想出一些自定义解析技术来做到这一点,但还是无济于事。Adobe的PDF手册充其量是最少的,因此,当我尝试创建解析器时,这无济于事。有谁知道解决这个问题。
在这一点上,我对任何语言的解决方案持开放态度,使用任何操作系统(尽管我更喜欢在 Windows 或 Linux 上使用 Python 3 的解决方案),只要它是开源/免费的。
这里有人能帮助结束这个黑暗的兔子洞吗?非常感激!
解决方案
PDF 文档由两种“类型”的数据组成。文档有一个面向对象的“结构”,将其划分为页面,并携带元数据(例如,有这个可选内容组列表),还有一个面向流的标记运算符列表,实际上“在页面上绘制”内容。
存在 OCG 及其名称以及一些关于它们的事实存储在面向对象的内容中,并且可以通过相当容易地解析对象内容来提取。但是 OCG 的成员资格不存储在对象结构中。只能通过解析 Content Stream 才能找到。一组标记操作员是特定 OCG 组的成员,如果它前面是内容操作员 /OC / optionacontentgroupname BDC,后面是操作员 EMC。
解析内容流是一项不那么简单的任务。有许多工具可以为您做到这一点。我自己不会尝试从头开始构建这样的解析器。重写轮子没有什么价值。
PDF 的完整语法可从许多来源获得。在网上搜索“PDF 规范 1.7”或“ISO32000-1:2008”。这是一个令人生畏的文档,但它确实提供了创建对象和内容解析器所需的所有信息
推荐阅读
- javascript - 导入语句如何在没有指定导入语句中的路径信息的情况下做出反应,因为模块导入不能有裸路径
- javascript - 文本框不会改变javascript中的颜色
- xcode - 当我进入一个新的 viewController 时打开两次
- ruby-on-rails - ActiveRecord 通过两个关联加入
- bash - 为什么 ls -lSh 命令返回非常小的文件大小?
- c++ - 查找地图 C++ 中出现的次数
- javascript - 在javascript中“或”布尔值列表的最短方法
- html - 为什么按钮边框不会比#f0f0f0 更亮?
- python - Python 错误:命令不同步;你现在不能运行这个命令
- python - 在 django 中安装此库“pip install bcrypt”时出错