试图理解 PDF 中的裁剪逻辑

Trying to understand clipping logic in PDF

我在 PDF 中的压缩流中有以下说明:

1 g
/GS1 gs
0 792 m
0 792 l
f
q
1 i 
0 792 612 -792 re
0 792 m
W n
0 792.06 612 -792 re
W n
  1. 将颜色设置为灰色。
  2. 加载一些外部词典信息
  3. 0 792
  4. 中开始子路径
  5. 0 中追加点 792
  6. 填充路径....为什么要填充 1 个灰色像素?
  7. 保存图形堆栈
  8. 将平滑度设置为 1
  9. 开始一个0792612-792矩形子路径
  10. 启动一个0 792 子路径....为什么要覆盖以前的矩形路径?
  11. 使 0 792 子路径成为剪切路径并删除当前路径。
  12. 开始一个0792.06612-792矩形。
  13. 用之前的裁剪路径裁剪之前的矩形0 792?

我遇到的问题是我没有找到裁剪如何工作的好例子。你剪哪条路?如果你之前没有剪辑路径,你剪辑什么?

谢谢!

首先,您的疑惑是对的,您展示的摘录中的很多内容毫无意义。

例如您的项目 3..5 涉及

0 792 m
0 792 l
f

PDF 规范对填充路径的说明如下:

If a subpath is degenerate (consists entirely of one or more points at the same coordinates), the subpath shall be considered to enclose the single device pixel lying under that point; the result is device-dependent and not generally useful.

(ISO 32000-2,第 8.5.3.3 节 — 填充)


你对

的解读
0 792 612 -792 re
0 792 m
W n

不过,您的项目 8..10 不正确。特别是你假设最后一行到

Make the 0 792 subpath the clipping path and remove the current path.

实际上 0 792 m 子路径被忽略,只有 0 792 612 -792 re 矩形与当前剪辑路径相交!

根据规范,剪辑路径相交的工作方式类似于填充

Subclause 8.5.3.3, "Filling" defines what is inside a path as well as stating rules for closing paths and for degenerate paths. For a given path definition, the same area that would be filled by the f operator is the area that would be used for a clip.

(ISO 32000-2,第 8.5.4 节 — 剪切路径运算符)

填充会掉落悬空 0 792 m

Any subpaths that are open shall be implicitly closed before being filled, except that if the last subpath in the path is a single-point open subpath (specified by a trailing m operator), it shall be disregarded and not considered to be part of the path.

(ISO 32000-2,第 8.5.3.3 节 — 填充)


因此您对

的解释
0 792.06 612 -792 re
W n

在您的项目 11 和 12 中

Clip the previous rectangle with the previous clipping path 0 792?

略有偏差:实际上这个矩形剪辑了之前的剪辑路径,最后被另一个几乎相同的矩形剪辑了。但这几乎没有比您最初的假设更有意义。


关于你的明确问题

Which path do you clip against? What do you clip against if you didn't have a clipping path before?

这里的规范说:

The initial clipping path shall include the entire page.

(ISO 32000-2,第 8.5.4 节 — 剪切路径运算符)