一、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/72 英寸
也就是 72 个单位 ≈ 1 英寸 ≈ 2.54 厘米。 -
原点:在页面左下角
- X 轴向右增到页面宽度
- Y 轴向上增到页面高度
-
旋转和平移:可以随时用矩阵命令
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 的“撤销系统”一样,
你在 q 和 Q 之间做的变换、颜色设置,出了 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) | 终点 |
S | stroke(描边) | 绘制线条 |
这条线几乎是水平的,长度大约:
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 是用数学定义的画布,每一条线、每一段文字、每一张图片,
都是坐标系和绘制命令共同作用的结果。