首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别哪些剪辑路径应用于路径或填写PDF矢量图形?

如何识别哪些剪辑路径应用于路径或填写PDF矢量图形?
EN

Stack Overflow用户
提问于 2013-06-08 19:42:47
回答 1查看 2.5K关注 0票数 2

我试图从PDF文件中提取矢量图形,并创建相应的SVG文件。为此,我使用SVGOutputDev (https://github.com/immateriel/pdf2svg/blob/master/SVGOutputDev.cc‎)和xpdf库。现在,SVGOutputDev还没有实现剪辑路径提取,我也在尝试实现同样的功能。虽然我能够提取剪辑路径定义本身,但我无法确定哪些定义适用于正常的笔画或填充区域。例如,请参考http://pastebin.com/jTdzv3YZ获取从PDF页面中提取的SVG,以及在提取过程中看到的PDF图形命令序列的相应转储。从SVG中可以看出,有多个剪辑路径和一个矩形填充区域。尽管在定义填充矩形之前定义了多个剪辑路径,但只有在之前定义的圆形剪辑路径矩形定义将与矩形相关联(根据PDF页面在各种PDF阅读器上的呈现方式,在白色背景中只显示2个填充的圆圈)。问题是如何知道哪些剪辑路径与PDF中定义的规则填充/笔画区域相关联?FYI,我浏览了PDF规范文档的相关部分,但对我来说并不十分清楚(“裁剪路径操作可能出现在最后一个路径构造操作符之后和终止路径对象的路径绘制操作符之前。虽然裁剪路径操作符出现在绘图操作符前面,但它不会在出现点改变剪裁路径。相反,它会修改后续绘制操作符的效果”。是否有人能解释如何识别相关的剪辑路径以应用于任何正常路径?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-10 10:34:28

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

简单地说,是在执行填充或笔画操作时定义的所有剪辑路径区域的交集,除了在Q(恢复状态)操作符中无效的区域之外。

因此,您对示例文件的分析

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

错误:不是最后一个剪辑区域,而是矩形定义之前的所有剪辑区域的交集定义当前剪辑区域。由于每个剪辑区域都包含在前面的一个区域中,所以交集的结果确实是由这两个圆圈组成的。

文档中的

图形状态应包含当前裁剪路径,该路径将限制受绘图运算符影响的页面区域。此路径的封闭子路径应定义可绘制的区域。 初始裁剪路径应包括整个页面。 裁剪路径操作符通过将当前路径与当前路径相交来修改当前的裁剪路径,使用非零绕组数规则/奇偶规则来确定裁剪路径中的哪些区域。 在没有引用当前路径的情况下,无法放大当前的剪裁路径或设置新的裁剪路径。但是,由于裁剪路径是图形状态的一部分,它的效果可以通过封装修改裁剪路径和在一对q和q运算符之间绘制这些对象来本地化到特定的图形对象(参见8.4.2,“图形状态堆栈”)。Q运算符的执行会使裁剪路径恢复到Q运算符在修改裁剪路径之前保存的值。 (现行PDF规范http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf第8.5.4节)

In action:让我们看看文档页面的内容流(它有一个Mediabox 0,0,595,842):

代码语言:javascript
复制
q
q

两次推送图形状态。

代码语言:javascript
复制
0 842 m 
0 0 l
595 0 l
595 842 l
h
W
n

定义与整个媒体框等效的剪辑路径。

代码语言:javascript
复制
1 w
2 J
0 j
10 M
[]0 d

定义一般图形状态属性(线宽、线帽样式、行联接样式、人数限制和破折号图案)。

代码语言:javascript
复制
q

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

代码语言:javascript
复制
0 718.5 m
595 718.5 l
595 123.5 l
0 123.5 l
0 718.5 l
h
W
n

定义一个剪辑路径,其中包含一个与整个媒体框一样宽的矩形,但切断124个用户空间单位高度的顶部和底部条纹。由于这个剪辑路径完全包含在前面设置的剪辑路径中,所以这里的交集等于这个剪辑路径。因此,当前的有效剪辑区域是这个较小的矩形。

代码语言:javascript
复制
0 718.5 m
595 718.5 l
595 123.5 l
0 123.5 l
0 718.5 l
h
W
n

定义一个与前一个相同的剪辑路径。因此,相交不会改变什么。

代码语言:javascript
复制
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

定义由两个圆子路径组成的剪辑路径。这两个圆不相交,因此我们不必处理“非零绕组数规则”和“偶数-奇数规则”之间的差异。此外,圆圈包含在当前剪辑区域内。因此,新的剪辑区域由这两个圆圈组成。

代码语言:javascript
复制
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

这将绘制一个填充的黑色矩形,其中包含当前裁剪区域。因此,整个裁剪区域(即两个圆圈)被涂成黑色。

代码语言:javascript
复制
Q
q

这会将图形状态还原到最后一个按下的状态。也就是说,任何后续操作的裁剪路径是第一个包含整个媒体框的路径。此图形状态再次被推送。

代码语言:javascript
复制
0 718.5 m
0 123.5 l
595 123.5 l
595 718.5 l
h
W
n

再次定义了在顶部和底部剪裁条的剪裁路径.

代码语言:javascript
复制
Q
q

..。并立即被还原状态操作删除;状态再次被推送。

代码语言:javascript
复制
0 718.5 m
0 123.5 l
595 123.5 l
595 718.5 l
h
W
n
Q
q

同样的..。

代码语言:javascript
复制
0 718.5 m
0 123.5 l
595 123.5 l
595 718.5 l
h
W
n
Q
q

..。一次又一次。

代码语言:javascript
复制
0 842 m
0 0 l
595 0 l
595 842 l
h
W
n

这再次定义了绕过整个媒体框的裁剪路径。由于这是当前的剪裁路径无论如何,没有任何改变的交叉。

代码语言:javascript
复制
Q
Q
Q

以前推到堆栈上的所有图形状态都会再次被删除。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17003171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档