PDF中的图形绘制与坐标系统

93 阅读4分钟

一、PDF中的图形绘制

PDF 文件不仅仅是文字和图片的集合。
在底层,它更像一块“画布”,而文件里记录的,是一组“画画指令”。

这些指令告诉渲染器:

  • 在哪里画线、画矩形;
  • 放置一段文字;
  • 显示一张图片;
  • 使用什么颜色、线宽和旋转角度。

例如下面这几行 PDF 命令:

100 100 m
200 100 l
S

其实就是:

从 (100,100) 移动画笔,画到 (200,100),然后描边绘制。

对应在PDF页面中就是页面绘制了一条直线。

二、PDF中的坐标系统

在 PDF 里,所有的图形、文字、图片都放在某个“坐标系统”下。
可以把它想成一层层叠起来的地图:

名称作用举例
用户空间(User Space)程序里绘图命令使用的坐标系统100 200 moveto
设备空间(Device Space)屏幕或打印机的真实像素坐标输出时才使用
文字空间(Text Space)用来控制文字排版旋转、间距、缩放文字
图像空间(Image Space)图片自身的坐标系统(通常 0~1)图片被放置前的原始坐标

PDF 会自动通过一个叫 CTM(Current Transformation Matrix,当前变换矩阵) 的工具,
把这些空间联系起来——就像把不同比例尺的地图叠在一起。

三、PDF 坐标的基本规则

  1. 单位:默认 1 个单位 = 1/72 英寸
    也就是 72 个单位 ≈ 1 英寸 ≈ 2.54 厘米。

  2. 原点:在页面左下角

    • X 轴向右增到页面宽度
    • Y 轴向上增到页面高度
  3. 旋转和平移:可以随时用矩阵命令 cm 改变坐标系统

    • [1 0 0 1 tx ty] cm 表示平移
    • [sx 0 0 sy 0 0] cm 表示缩放
    • [cosθ sinθ -sinθ cosθ 0 0] cm 表示旋转

通过叠加这些矩阵,就可以灵活控制图形的位置和方向。

四、WPS示例

我在 WPS 中新建了一个空白 PDF,
只画了一条线,得到的内容流如下(已略去水印部分):

q
0 0 0 rg
0 0 0 RG
/KSPE1 gs
1 0 0 1 0 0 cm
61.0670 706.8275 m
298.2766 708.3281 l
S
Q

解析上面内容:

1️⃣ q 和 Q —— 保存与恢复状态

  • q:保存当前图形状态
  • Q:恢复图形状态

就像 Photoshop 的“撤销系统”一样,
你在 qQ 之间做的变换、颜色设置,出了 Q 就全部还原。

2️⃣ 设置颜色

0 0 0 rg
0 0 0 RG
  • rg:设置填充颜色(fill color)为黑色
  • RG:设置描边颜色(stroke color)为黑色

这意味着接下来的线会用黑色绘制。

3️⃣ 应用画笔样式

/KSPE1 gs

这句是应用一个 WPS 生成的“画笔状态”,
可能包括线宽、透明度、线帽样式等。

4️⃣ 坐标系统(CTM)

1 0 0 1 0 0 cm

这是一组“单位矩阵”,表示没有任何旋转、平移或缩放。
也就是说,接下来的绘图都在页面默认坐标系统中完成。

5️⃣ 画线命令

61.0670 706.8275 m
298.2766 708.3281 l
S

解释如下:

命令含义结果
m移动画笔到 (61.067, 706.8275)起点
l画线到 (298.2766, 708.3281)终点
Sstroke(描边)绘制线条

这条线几乎是水平的,长度大约:

298.28 - 61.07 ≈ 237.21 点
≈ 3.29 英寸 ≈ 8.36 厘米

它位于页面上方(Y=706),
A4 页面的高度约为 842 点,因此距离顶部大约还有 842-708 ≈ 134 点(约4.7厘米)。

图示(概念示意):

 ↑ Y轴
 |
 |       ●——————————————●
 |       (61,707)   (298,708)
 |
 +——————————————————————→ X轴
(0,0)

五、延伸:WPS 自动生成的水印部分

没开会员时,一般保存WPS 自动加上了一段水印内容:

/Artifact <</Subtype/Watermark>>BDC
q
/KSPE3 gs
0.572461 0.208359 -0.208359 0.572461 116.441345 309.613983 cm
/KSPX2 Do
Q
EMC

这一部分主要展示了“坐标变换矩阵”。

矩阵:

[ 0.5724  0.2083  -0.2083  0.5724  116.44  309.61 ]

代表:

  • 缩放:0.57 倍大小;
  • 旋转:因为 b、c 不为 0,说明有旋转;
  • 平移:移动到 (116, 309) 位置。

这段矩阵把坐标系统旋转、缩小、平移后,
执行 /KSPX2 Do 绘制一个外部对象(就是那张半透明水印图)。

六、总结

PDF 绘制过程的逻辑非常清晰:

阶段操作对应命令
1️⃣ 建立坐标系平移、旋转、缩放cm
2️⃣ 设置画笔线宽、颜色、透明度RG, rg, gs
3️⃣ 构建路径移动、画线、画矩形m, l, re
4️⃣ 绘制描边或填充S, f, B
5️⃣ 状态管理保存与恢复q, Q

一句话总结:

PDF 是用数学定义的画布,每一条线、每一段文字、每一张图片,
都是坐标系和绘制命令共同作用的结果。