如何获取 EPS 文件中元素的边界框

How to get bounding boxes of elements in EPS files

我需要检查 EPS/PDF 文件是否包含任何矢量元素

首先,我将 PDF 转换为 EPS,然后像这样从文件中删除所有文本元素和图像

pdftocairo -f $page_number -l $page_number -eps $input - | sed '/BT/,/ET/ d' | sed '/^8 dict dup begin$/,/^Q$/ c Q' > $output

但是我怎样才能检查是否有任何元素写入 canvas?

'vector elements' 到底是什么意思?除了实际的位图图像之外还有什么?你为什么在乎 ?也许如果你解释了你想要实现的目标,它会更容易帮助你。

请注意,您使用的方法决不能保证有效,文件中很容易存在 'elements',您使用相当基本的查找图像的方法不会将其删除。

你可以使用 Ghostscript; 运行 将文件转换为位图并指定 -dFILTERTEXT 和 -dFILTERIMAGES。然后检查位图的像素以查看是否有 non-white。如果是,则文件中有矢量内容。您可能会使用类似 ImageMagick 的东西来计算颜色并查看是否超过 1。

或运行 将文件位图两次,一次正常,一次使用-dFILTERVECTOR。比较两个位图(它们上的 MD5 就足够了)。如果没有差异,则没有矢量内容。

任何具有矢量元素的 PDF 都将至少使用一种路径绘制运算符。根据 PDF 标准的第 8 章,它们是:

S, s, f, F, f*, B, B*, b, b*, n

当然,由于 PDF 文件可能很复杂,您还需要标准格式的文件。您可以使用 qpdf 程序的 QDF 格式来做到这一点。 (apt install qpdf 如果你没有)。

qpdf -qdf schedule.pdf - | egrep -m1 -q '\b[SsfFBbn]\*?$'  && echo Yup

如果文件 schedule.pdf 中包含矢量图形,则会打印 "Yup"。


注意:我认为这会为您完成工作,但并非万无一失。如果您的 PDF 从外部文件加载矢量、嵌入原始后记或执行其他一些技巧,则可能会出现漏报。而且,当然它可能有误报(例如,一个文件在白色背景上用白色墨水绘制一个完全透明的 0pt 点)。

其他答案已经解决了在纯文本流中识别绘图运算符的问题。对于另一个问题,

But how can I then check if any elements are written to the canvas?

为此,元素需要是引用的内容流的一部分 在 Page 对象的 /Contents 成员中。

如果您读入所有 pdf 对象,将会有一个树将所有内容流连接到预告片中声明的 Root 对象。

  • 预告片:/Root 是对文档目录对象的引用
  • 文档目录:/Pages 是页面对象或页面节点的数组
  • Page : /Contents 是对绘制页面元素的内容流对象的引用数组

文档树中可能存在未引用的杂散内容流对象。通过遍历页面树,您可以收集任何和所有实际内容,然后将该结果提供给其他答案中的一个解决方案。