上周把签好字的巡检表发给现场打印,回来一看,签名那一块像蒙了层雾,边缘还贴着纸边。原文件是矢量排的表格,字很清楚,只有签名糊。把输出文件拆开看了看图像对象,问题不在工具本身,而在一个很朴素的算式:像素数除以显示尺寸。
这篇把 PDF 签名的三个边界拆开讲:签名的本质是什么、有效分辨率怎么算、坐标为什么会把签名推到纸边。最后用在线工具跑一遍三档尺寸做验证。
一、PDF 里的签名不是字,是一张图
很多人以为"电子签名"是往 PDF 里写了一段字,其实不是。PDF 的页面内容是一串绘图指令,文字用文本对象(BT/ET)画,图片用图像 XObject 画(/Subtype /Image)。手写签名因为笔迹不规则,几乎都是以图像 XObject 的形式插进去的;即便你选的是"文字签名",不少工具也是先渲染成位图再贴。
这带来一个直接后果:签名清不清楚,只取决于两件事------这张图有多少像素,以及它在页面上占多大。
PDF 的长度单位是 pt(point),1 pt = 1/72 英寸,和 CSS 的 px 不是一回事。A4 页面是 595.28 × 841.89 pt,换算过来 210 × 297 mm。页面上的图像 XObject 有一个自己的像素尺寸,再被一条变换矩阵映射到页面的某个矩形里,这个矩形就是它在纸上的实际大小。
我上传的是一份 A4 的巡检记录表,单页,签名位置选"右下",大小 25%。签名方式用的手写板,画了两笔:

关键点在这里:手写板导出的签名图,尺寸是固定的 352 × 135 px。你把"签名大小"从 15% 拖到 50%,变的是它在页面上占的矩形,不是这张图的像素数。
二、有效分辨率:一个除法就能算清
有效分辨率(DPI)的定义是:每英寸长度上铺了多少个像素。写成公式:
DPI = 图像像素宽度 ÷ (显示宽度 pt ÷ 72)
拿三档尺寸各跑一次,读数如下(都是同一张 352×135 px 的签名图):
| 签名大小 | 页面上的宽度 | 折合毫米 | 有效 DPI |
|---|---|---|---|
| 15% | 89.3 pt | 31.5 mm | 283.8 |
| 25% | 148.8 pt | 52.5 mm | 170.3 |
| 50% | 297.6 pt | 105.0 mm | 85.2 |

三个数一摆,结论就出来了:放大不是变清晰,是把同样的像素摊薄。25% 时 170 DPI,屏幕上看着没问题;到 50% 只剩 85 DPI,打印出来边缘一定是锯齿加灰边。
反过来推也简单:这张图要满足印刷的 300 DPI,最多只能显示到 352 ÷ 300 × 72 ≈ 84.5 pt,也就是 29.8 mm 宽。想要在半页宽(105 mm)上还保持 300 DPI,签名图得是 1240 px 宽------是现在这张的三倍半。
所以"签名发虚"这件事,九成不是压缩算法的问题,是原图根本不够像素。
三、"右下"为什么贴到了纸边
第二个坑是坐标。
PDF 的坐标系原点在页面左下角 ,y 轴向上;网页 canvas 的原点在左上角,y 轴向下。工具把 canvas 上的笔迹搬到 PDF 上,中间要做一次翻转:
y_pdf = 页高 - y_canvas - 图高
只要有一个环节把"页高"取错(比如拿 CSS 高度当 pt 高度),签名就会整体偏上或偏下。位置预设更简单粗暴:选"右下",就是把图像矩形的右下角对齐到 (595.28, 841.89)。
我拆开输出文件量了一下,签名图像的边界是 [446.5, 738.3, 595.3, 841.9],右边距 0.00 pt、下边距 0.00 pt:

这就是"贴着纸边"的来源。家用和办公打印机普遍有 3--5 mm 的不可打印区,签名压在这条带上,轻则被裁掉一截,重则整块打不出来。要做正式文件,位置别用预设,选"自定义"把签名往里挪 15--20 pt(约 5--7 mm),留出安全边距。
四、几个容易踩的边界
1. 手写板的画布尺寸就是清晰度上限。 画布固定 600 × 200,导出时按笔迹外框裁掉空白,所以实际像素会小于画布。想把签名做大又清楚,只能提高导出分辨率,靠拖大尺寸没用。
2. PNG 透明底和 JPG 白底不是一回事。 透明底在 PDF 里带一个软蒙版(SMask),叠在表格线上不会挡住内容;JPG 白底是一个实心矩形,压到表格上就是一块白斑。
3. 电子签和印刷签的要求不同。 只在屏幕上流转的文件,150 DPI 就够看;要打印归档,按 300 DPI 备料。扫描件回传的场景更麻烦,扫描本身只有 200--300 DPI,再叠一个 85 DPI 的签名,反差会非常明显。
4. 文件体积不是判断依据。 这次源文件 9.3 KB,签名后 8.8 KB,反而小了------工具重写了对象流,省下的字节比新加的签名图还多。体积和清晰度没有必然关系,别拿体积当质量指标。
5. 表单域还在。 源文件是带 6 个 AcroForm 字段的版本,签名后这 6 个字段依然在,说明插入的是一张图,不是把页面压平成图片。这两条路线的差别很大:压平后表单不能再填,图像插入则保留原有结构。
五、排查顺序
遇到签名发虚,按这个顺序查,基本一次能定位:
- 先量签名在页面上的实际宽度(pt),换算成英寸;
- 再查签名图的像素宽度,两者一除,得到有效 DPI;
- 低于 150 就缩小显示尺寸,或者换更高分辨率的签名图;
- 位置别用四角预设,自定义留 5 mm 以上边距;
- 最后才考虑压缩参数------大多数情况下压根轮不到它。
签名这个场景,本质是把一张位图放进一个矢量的坐标系里。搞清楚"像素 ÷ 尺寸"和"原点在哪",比换工具管用。
这次验证我用的是工具派上的 PDF 签名工具,顺手把读数记了下来。工具地址:gjupai.com/tools/pdf_signature