我需要检查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
但是,如何检查是否有任何元素写入画布?
答案 0 :(得分:3)
任何包含矢量元素的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
打印" Yup"如果文件schedule.pdf中有矢量图形。
注意:我认为这将为您完成工作,但这不是万无一失的。如果您的PDF正在从外部文件加载向量,嵌入原始postscript或做其他一些技巧,则可能会出现漏报。当然,它可能有误报(例如,在白色背景上用白色墨水绘制完全透明的0pt点的文件)。
答案 1 :(得分:2)
你是什么意思,确切地说,是由矢量元素' ?除了实际的位图图像以外的任何东西?你为什么在乎 ?也许如果你解释了你想要实现的目标,那么帮助你会更容易。
请注意,您使用的方法无法保证可以正常使用,因此可以很容易地使用'元素'在文件中,通过您基本的寻找图像的方法将其删除。
你可以使用Ghostscript;将文件运行到位图并指定-dFILTERTEXT和-dFILTERIMAGES。然后检查位图的像素,看看是否有非白色。如果是,那么文件中有矢量内容。您可以使用像ImageMagick这样的东西来计算颜色,看看是否有超过1的颜色。
或者将文件运行到位图两次,一次正常,一次运行-dFILTERVECTOR。比较两个位图(它们上的MD5就足够了)。如果没有差异则没有矢量内容。
答案 2 :(得分:0)
其他答案已经解决了在纯文本流中识别绘图运算符的问题。对于另一个问题,
但是,如何检查是否有任何元素写入画布?
为此,元素需要是所引用的内容流的一部分
在/Contents
对象的Page
成员中。
如果您读入所有pdf对象,则会有一棵树将所有内容流连接到预告片中声明的Root
对象。
可能存在未在“文档”树中引用的杂散内容流对象。通过遍历页面树,您可以收集任何和所有实际内容,然后将结果提供给其他答案中的一个解决方案。