通过 OCG(按层)从 PDF 中提取几何元素
Extract Geometry Elements from PDF by OCG (by Layer)
所以我在这个问题上花了一个月的大部分时间。我正在寻找一种从由文件的 OCG(可选内容组)组织的矢量化 PDF 中提取几何元素(多段线、文本、圆弧等)的方法,这些元素基本上是 PDF 图层。使用 PDFminer,我能够提取几何图形(LTCurves、LTTextBoxes、LTLines 等);使用 PyPDF2,我能够查看 PDF 中有多少 OCG,尽管我无法访问与该 OCG 关联的几何图形。有一些我在网上看到并尝试过的 hacky 脚本可能已经能够解决这个问题,但无济于事。我什至求助于在文本编辑器中打开原始 PDF 数据,然后冒险删除其中的一部分,看看我是否可以想出一些自定义解析技术来做到这一点,但同样无济于事。 Adobe 的 PDF 手册充其量是最少的,因此在我尝试创建解析器时没有帮助。有谁知道这个的解决方案。
在这一点上,我愿意接受任何语言的解决方案,使用任何 OS(尽管我更喜欢在 Windows 或 [= 上使用 Python 3 的解决方案18=]), 只要它是开源/免费的。
这里的任何人都可以帮助结束这个黑暗的兔子洞吗?非常感谢!
一个 PDF 文档由两个 "types" 数据组成。有一个面向对象 "structure" 的文档将其分成页面,并携带元数据(例如,有这个可选内容组列表),还有一个面向流的标记操作符列表实际上 "draw" 内容到页面上。
存在 OCG、它们的名称以及一些关于它们的事实存储在面向对象的内容中,并且可以通过相当容易地解析对象内容来提取。但 OCG 的成员资格并未存储在对象结构中。它只能通过解析内容流来找到。当一组标记运算符前面是内容运算符 /OC /optionacontentgroupname BDC 并且后面是运算符 EMC.
时,它就是特定 OCG 组的成员。
解析内容流并非易事。有许多工具可以为您完成这项工作。我自己不会尝试从头开始构建这样的解析器。重写轮子的价值不大。
PDF 的完整语法可从许多来源获得。在网络上搜索 "PDF Specification 1.7" 或 "ISO32000-1:2008"。这是一份令人望而生畏的文档,但它确实提供了创建对象和内容解析器所需的所有信息
如果您的 PDF 是在 OGC 图层中组织的,那么您可以使用 gdal_translate 命令 GDAL。
使用以下命令检查 PDF 文件中所有可用的 OGC 图层:
gdalinfo "sample.pdf" -mdd LAYERS
然后,使用以下命令提取特定层:
gdal_translate "sample.pdf" -of PNG sample.png --config GDAL_PDF_LAYERS "your_specific_layer_name"
提到了更多细节here。
嘿@pythonic_programmer,我可以使用这个 python 库 pdflayers 禁用默认视图(visible/not 可见)图层到新的pdf文件中。
https://pypi.org/project/pdflayers/
差不多就是禁用图层的默认状态
在 pdf 文件中:https://helpx.adobe.com/acrobat/using/pdf-layers.html
任何层不可见意味着该层在您处理时不会呈现到 pdf 文档(默认情况下)。
所以我在这个问题上花了一个月的大部分时间。我正在寻找一种从由文件的 OCG(可选内容组)组织的矢量化 PDF 中提取几何元素(多段线、文本、圆弧等)的方法,这些元素基本上是 PDF 图层。使用 PDFminer,我能够提取几何图形(LTCurves、LTTextBoxes、LTLines 等);使用 PyPDF2,我能够查看 PDF 中有多少 OCG,尽管我无法访问与该 OCG 关联的几何图形。有一些我在网上看到并尝试过的 hacky 脚本可能已经能够解决这个问题,但无济于事。我什至求助于在文本编辑器中打开原始 PDF 数据,然后冒险删除其中的一部分,看看我是否可以想出一些自定义解析技术来做到这一点,但同样无济于事。 Adobe 的 PDF 手册充其量是最少的,因此在我尝试创建解析器时没有帮助。有谁知道这个的解决方案。
在这一点上,我愿意接受任何语言的解决方案,使用任何 OS(尽管我更喜欢在 Windows 或 [= 上使用 Python 3 的解决方案18=]), 只要它是开源/免费的。
这里的任何人都可以帮助结束这个黑暗的兔子洞吗?非常感谢!
一个 PDF 文档由两个 "types" 数据组成。有一个面向对象 "structure" 的文档将其分成页面,并携带元数据(例如,有这个可选内容组列表),还有一个面向流的标记操作符列表实际上 "draw" 内容到页面上。
存在 OCG、它们的名称以及一些关于它们的事实存储在面向对象的内容中,并且可以通过相当容易地解析对象内容来提取。但 OCG 的成员资格并未存储在对象结构中。它只能通过解析内容流来找到。当一组标记运算符前面是内容运算符 /OC /optionacontentgroupname BDC 并且后面是运算符 EMC.
时,它就是特定 OCG 组的成员。解析内容流并非易事。有许多工具可以为您完成这项工作。我自己不会尝试从头开始构建这样的解析器。重写轮子的价值不大。
PDF 的完整语法可从许多来源获得。在网络上搜索 "PDF Specification 1.7" 或 "ISO32000-1:2008"。这是一份令人望而生畏的文档,但它确实提供了创建对象和内容解析器所需的所有信息
如果您的 PDF 是在 OGC 图层中组织的,那么您可以使用 gdal_translate 命令 GDAL。
使用以下命令检查 PDF 文件中所有可用的 OGC 图层:
gdalinfo "sample.pdf" -mdd LAYERS
然后,使用以下命令提取特定层:
gdal_translate "sample.pdf" -of PNG sample.png --config GDAL_PDF_LAYERS "your_specific_layer_name"
提到了更多细节here。
嘿@pythonic_programmer,我可以使用这个 python 库 pdflayers 禁用默认视图(visible/not 可见)图层到新的pdf文件中。 https://pypi.org/project/pdflayers/
差不多就是禁用图层的默认状态 在 pdf 文件中:https://helpx.adobe.com/acrobat/using/pdf-layers.html
任何层不可见意味着该层在您处理时不会呈现到 pdf 文档(默认情况下)。