Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定哪些剪辑路径应用于路径或填充PDF矢量图形?_Pdf_Svg_Clipping_Xpdf - Fatal编程技术网

如何确定哪些剪辑路径应用于路径或填充PDF矢量图形?

如何确定哪些剪辑路径应用于路径或填充PDF矢量图形?,pdf,svg,clipping,xpdf,Pdf,Svg,Clipping,Xpdf,我试图从PDF文件中提取矢量图形,并创建相应的SVG文件。我正在使用SVGOutputDev(‎) 使用xpdf库实现此目的。现在SVGOutputDev尚未实现剪辑路径提取,我正在尝试实现相同的功能。虽然我能够提取剪辑路径定义本身,但我无法确定这些定义中的哪些适用于普通笔划或填充区域。例如,请参阅以了解我从中提取的SVG一页PDF,以及在提取过程中看到的PDF图形命令序列的相应转储。从该SVG中可以看到,有多个剪辑路径和一个矩形填充区域。尽管在定义填充矩形之前定义了多个剪辑路径,但只有在之前定

我试图从PDF文件中提取矢量图形,并创建相应的SVG文件。我正在使用SVGOutputDev(‎) 使用xpdf库实现此目的。现在SVGOutputDev尚未实现剪辑路径提取,我正在尝试实现相同的功能。虽然我能够提取剪辑路径定义本身,但我无法确定这些定义中的哪些适用于普通笔划或填充区域。例如,请参阅以了解我从中提取的SVG一页PDF,以及在提取过程中看到的PDF图形命令序列的相应转储。从该SVG中可以看到,有多个剪辑路径和一个矩形填充区域。尽管在定义填充矩形之前定义了多个剪辑路径,但只有在之前定义的圆形剪辑路径ng>矩形定义应与矩形关联(根据PDF页面在各种PDF阅读器上的呈现方式,在白色背景中仅显示两个黑色填充的圆圈)。问题是如何知道哪些剪辑路径与PDF中定义的常规填充/笔划区域相关?仅供参考,我浏览了PDF规范文档的相关部分,但不太清楚("剪切路径操作可能出现在最后一个路径构造操作符之后和终止路径对象的路径绘制操作符之前。尽管剪切路径操作符出现在绘制操作符之前,但它不会改变剪切路径出现的位置。相反,它会修改后续绘制操作的效果有人能解释一下如何识别适用于任何正常路径的相关剪辑路径吗

问题是如何知道哪些剪辑路径与PDF中定义的常规填充/笔划区域关联

简而言之:执行填充或笔划操作时定义的所有剪辑路径区域的交点适用,但在Q(恢复状态)操作符期间无效的剪辑路径区域除外

因此,您需要对示例文件进行分析

尽管在定义填充矩形之前定义了多个剪辑路径,但预期只有在矩形定义之前定义的圆形剪辑路径与矩形相关联(根据PDF页面在各种PDF阅读器上的呈现方式,在白色背景中仅显示两个黑色填充圆)

错误:不是最后一个剪辑区域,而是矩形定义定义当前剪辑区域之前所有剪辑区域的交点。由于这些剪辑区域中的每一个都包含在前一个剪辑区域中,因此交点的结果实际上由这两个圆组成

0 0 0 rg
49.58 668.92 m
545.42 668.92 l
545.42 173.08 l
49.58 173.08 l
49.58 668.92 l
h
f
在文档中:

图形状态应包含一个当前剪切路径,该路径限制受绘制操作符影响的页面区域。该路径的闭合子路径应定义可绘制的区域

初始剪辑路径应包括整个页面

[Clipping Path Operators]通过与当前路径相交来修改当前剪裁路径,使用[Non Zero winding number rule/偶数-奇数规则]确定哪些区域位于剪裁路径内

如果不参考当前剪裁路径,则无法放大当前剪裁路径或设置新的剪裁路径。但是,由于剪裁路径是图形状态的一部分,因此可以通过将剪裁路径的修改和这些对象的绘制包含在一对q之间,将其效果局限于特定图形对象和Q运算符(参见8.4.2,“图形状态堆栈”)。执行Q运算符会使剪裁路径恢复为修改剪裁路径之前由Q运算符保存的值

(当前PDF规范第8.5.4节)

实际操作:让我们看看文档页面的内容流(它有一个Mediabox[0,0595842]):

两次按下图形状态

0 842 m 
0 0 l
595 0 l
595 842 l
h
W
n
定义与整个媒体盒等效的剪辑路径

1 w
2 J
0 j
10 M
[]0 d
定义常规图形状态特性(线宽、线帽样式、线连接样式、斜接限制和划线图案)

再次推送图形状态,这次使用显式设置的剪辑路径和其他图形属性

0 718.5 m
595 718.5 l
595 123.5 l
0 123.5 l
0 718.5 l
h
W
n
定义一个剪辑路径,该路径包含一个与整个媒体盒一样宽的矩形,但会切断124个用户空间单位高度的顶部和底部条纹。由于此剪辑路径完全包含在前面设置的剪辑路径中,因此在此交点等于此剪辑路径。因此,当前有效的剪辑区域就是这个较小的矩形

0 718.5 m
595 718.5 l
595 123.5 l
0 123.5 l
0 718.5 l
h
W
n
定义与前一个相同的剪辑路径。因此,与它们相交不会改变任何内容

148.75 668.92 m
93.98 668.92 49.58 624.52 49.58 569.75 c
49.58 514.98 93.98 470.58 148.75 470.58 c
203.52 470.58 247.92 514.98 247.92 569.75 c
247.92 624.52 203.52 668.92 148.75 668.92 c
h
347.08 470.58 m
292.32 470.58 247.92 426.18 247.92 371.42 c
247.92 316.65 292.32 272.25 347.08 272.25 c
401.85 272.25 446.25 316.65 446.25 371.42 c
446.25 426.18 401.85 470.58 347.08 470.58 c
h
W
n
定义由两个圆子路径组成的剪辑路径。这两个圆不相交;因此我们不必处理“非零绕组数规则”和“奇偶规则”之间的差异。此外,这些圆包含在当前剪辑区域内。因此,新剪辑区域由这两个圆组成

0 0 0 rg
49.58 668.92 m
545.42 668.92 l
545.42 173.08 l
49.58 173.08 l
49.58 668.92 l
h
f
这将绘制一个包含当前剪辑区域的填充黑色矩形。因此,整个剪辑区域(即两个圆)将被绘制为黑色

Q
q
这会将图形状态恢复到上次按下的状态。即,以下任何操作的剪辑路径都是包含整个媒体盒的第一个路径。再次按下此图形状态

0 718.5 m
0 123.5 l
595 123.5 l
595 718.5 l
h
W
n
再次在顶部和底部定义了剪切条的剪切路径

Q
q
…并立即被还原状态操作删除;该状态再次被推送

0 718.5 m
0 123.5 l
595 123.5 l
595 718.5 l
h
W
n
Q
q
同样的

0 718.5 m
0 123.5 l
595 123.5 l
595 718.5 l
h
W
n
Q
q
……一次又一次

0 842 m
0 0 l
595 0 l
595 842 l
h
W
n
这再一次定义了一条环绕整个媒体盒的剪辑路径。由于这是当前剪辑路径,所以intersect不会改变任何内容
0 842 m
0 0 l
595 0 l
595 842 l
h
W
n
Q
Q
Q