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

Pdf 如何获取EPS文件中元素的边界框,pdf,postscript,eps,Pdf,Postscript,Eps,我需要检查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 但是我怎样才能检查是否有任何元素被写入画布?你所说的“向量元素”到底是什么意思?除了实际的位图图像,还有别的吗?你为什么

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

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

你所说的“向量元素”到底是什么意思?除了实际的位图图像,还有别的吗?你为什么在乎?也许如果你解释了你想要实现的目标,你会更容易得到帮助

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

你可以使用幽灵脚本;将文件运行到位图,并指定-dFILTERTEXT和-dFILTERIMAGES。然后检查位图的像素,看是否有非白色的像素。如果是,则文件中存在向量内容。你可能会使用ImageMagick之类的工具来计算颜色,看看颜色是否超过1


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

你所说的“矢量元素”到底是什么意思?除了实际的位图图像,还有别的吗?你为什么在乎?也许如果你解释了你想要实现的目标,你会更容易得到帮助

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

你可以使用幽灵脚本;将文件运行到位图,并指定-dFILTERTEXT和-dFILTERIMAGES。然后检查位图的像素,看是否有非白色的像素。如果是,则文件中存在向量内容。你可能会使用ImageMagick之类的工具来计算颜色,看看颜色是否超过1


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

任何具有矢量元素的PDF都将使用至少一个路径绘制操作符。根据PDF标准第8章,这些是:

S, s, f, F, f*, B, B*, b, b*, n
当然,由于PDF文件可能很复杂,您还需要标准格式的PDF文件。您可以使用
qpdf
程序的
QDF
格式来实现这一点。(
apt安装qpdf
如果您没有它)

如果文件schedule.pdf中包含矢量图形,则会打印“是”



注:我认为这将为你做的工作,但它不是傻瓜证明。如果您的PDF正在从外部文件加载向量、嵌入原始postscript或执行其他一些技巧,则可能会出现误报。当然,它可能有误报(例如,在白色背景上用白色墨水绘制完全透明的0pt点的文件)。

任何具有矢量元素的PDF都将使用至少一个路径绘制操作符。根据PDF标准第8章,这些是:

S, s, f, F, f*, B, B*, b, b*, n
当然,由于PDF文件可能很复杂,您还需要标准格式的PDF文件。您可以使用
qpdf
程序的
QDF
格式来实现这一点。(
apt安装qpdf
如果您没有它)

如果文件schedule.pdf中包含矢量图形,则会打印“是”



注:我认为这将为你做的工作,但它不是傻瓜证明。如果您的PDF正在从外部文件加载向量、嵌入原始postscript或执行其他一些技巧,则可能会出现误报。当然,它也可能有误报(例如,一个文件在白色背景上用白色墨水绘制了一个完全透明的0pt点)。

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

但是如何检查是否有任何元素被写入画布

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

如果读入所有pdf对象,将有一棵树将所有内容流连接到拖车中声明的
根对象

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

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

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

但是如何检查是否有任何元素被写入画布

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

如果读入所有pdf对象,将有一棵树将所有内容流连接到拖车中声明的
根对象

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

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

不要忘记,内容流可以(通常会)压缩,因此您需要先解压缩它们