【问题标题】:How to get bounding boxes of elements in EPS files如何获取 EPS 文件中元素的边界框
【发布时间】:2018-03-20 11:46:29
【问题描述】:

我需要检查 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

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

【问题讨论】:

    标签: pdf postscript eps


    【解决方案1】:

    “向量元素”到底是什么意思?除了实际的位图图像之外的任何东西?你为什么在乎 ?如果您解释了您想要实现的目标,也许会更容易为您提供帮助。

    请注意,您使用的方法并不能保证有效,文件中很容易有“元素”,您的查找图像的基本方法不会删除这些“元素”。

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

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

    【讨论】:

    • 您提到的其中一个开关称为-dFILTERIMAGE,没有尾随的S
    【解决方案2】:

    任何具有矢量元素的 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 从外部文件加载矢量、嵌入原始 postscript 或执行其他一些技巧,则可能会出现误报。当然,它也可能有误报(例如,一个文件在白色背景上用白色墨水绘制了一个完全透明的 0pt 点)。

    【讨论】:

    • 不要忘记内容流可以(通常会)被压缩,因此您需要先解压缩它们,然后才能对内容使用 grep(可能这就是您使用 qpdf 所做的事情)。如果文件包含任何二进制数据,例如图像或字体,您几乎肯定会得到误报(其中很多)。
    • 正确。这就是我对 qpdf 所做的。 “QDF”格式是一种特殊格式的未压缩 PDF,可以很容易地在文本编辑器中解析甚至编辑。
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2022-01-17
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多