所以我在这个问题上花了一个月的大部分时间。我正在寻找一种从文件的OCG(可选内容组)组织的矢量化PDF中提取几何元素(折线,文本,弧等)的方法,这些文件基本上是PDF层。使用PDFminer,我能够提取几何图形(LTCurves,LTTextBoxes,LTLines等);使用PyPDF2,尽管我无法访问与该OCG相关的几何图形,但能够查看PDF中有多少个OCG。我见过一些骇人听闻的脚本,并在网上尝试过,它们也许能够解决此问题,但无济于事。我什至诉诸于在文本编辑器中打开原始PDF数据,并半危险地删除其中的一部分,以查看是否可以采用某种自定义解析技术来做到这一点,但仍然无济于事。 Adobe的PDF手册充其量是最少的,因此在尝试创建解析器时没有帮助。有谁知道解决方案。
在这一点上,我愿意使用任何操作系统的任何语言的解决方案(尽管我更喜欢在Windows或Linux上使用Python 3的解决方案),只要它是开源/免费的即可。
这里有人可以帮助结束这个兔子的黑暗之洞吗?非常感谢!
答案 0 :(得分:3)
PDF文档包含两种“类型”的数据。该文档有一个面向对象的“结构”,可以将其分为页面,并携带元数据(例如,有可选内容组的列表),还有一个面向流的标记操作符列表,这些操作符实际上是“在页面上绘制“内容。
存在OCG,它们的名称以及一些有关它们的事实存储在面向对象的内容上,可以通过相当容易地解析对象内容来提取。但是OCG的成员身份不存储在对象结构中。只能通过解析内容流来找到它。内容运算符/ OC / optionacontentgroupname BDC之前,一组标记运算符是特定OCG组的成员,然后是运算符EMC。
解析内容流不是一件容易的事。有很多工具可以为您完成此任务。我本人不会尝试从头开始构建这样的解析器。重写轮子没有什么价值。
可从许多来源获得PDF的完整语法。在Web上搜索“ PDF规范1.7”或“ ISO32000-1:2008”。这是一个令人生畏的文档,但是它确实提供了创建对象和内容解析器所需的所有信息
答案 1 :(得分:1)
如果您的PDF是用OGC图层组织的,则可以使用GDAL的 gdal_translate 命令。
使用以下命令检查PDF文件中所有可用的OGC层:
gdalinfo "sample.pdf" -mdd LAYERS
然后,使用以下命令提取颗粒层:
gdal_translate "sample.pdf" -of PNG sample.png --config GDAL_PDF_LAYERS "your_specific_layer_name"
提到了更多详细信息here。
答案 2 :(得分:-1)
嘿@pythonic_programmer,我可以使用这个python 库pdflayers 将图层的默认视图(可见/不可见)禁用到新的pdf 文件中。 https://pypi.org/project/pdflayers/
几乎意味着禁用图层的默认状态 在 pdf 文件中:https://helpx.adobe.com/acrobat/using/pdf-layers.html
任何不可见的图层意味着该图层在您处理时不会渲染到 pdf 文档(默认情况下)。