PDF 电子签名
手写 / 上传签名 → 放入 PDF · 浏览器本地处理
添加电子签名/印章图片
手写 / 上传签名 → 放入 PDF · 浏览器本地处理
了解工具定位 · 使用场景 · 对比优势
给 PDF 文件添加电子签名或印章图片,支持调整位置、大小和透明度。合同签署、标书盖章、发票盖章等场景,无需打印扫描,直接在线完成。文件上传后由后端处理,处理完成后自动下载,原始文件不会长期存储。
企业法务或 HR 收到对方发来的 PDF 合同扫描件,需要加盖公司公章后回传。传统流程:打印 → 盖章 → 扫描 → 邮件,每次至少 15 分钟。本工具直接在 PDF 指定位置插入印章图片(支持透明 PNG),调整大小与角度后导出带签章的电子文件,全程无需打印机,适合高频合同签署场景。
自由职业者提交项目报价单、兼职协议时,对方要求手写签名。没有扫描仪或手写板,用手机拍下白纸上的签名照片,裁剪后导入本工具,即可将签名图片精准放置在 PDF 签名栏位置。支持多次调整位置,直到与模板签名框对齐,省去打印手签再扫描的麻烦。
财务人员每月需对 50+ 份报销单 PDF 加盖财务专用章。手动逐份处理耗时且容易漏盖。本工具上传印章图片后,可连续打开多份 PDF,每次只调整位置(印章大小和透明度已预设),10 分钟内完成全部盖章,比传统方式快 3-4 倍。
审计时发现 3 年前的采购合同缺少供应商盖章页。原供应商已无法联系,但公司需要补签一份电子版归档。将旧合同 PDF 扫描件导入,在指定位置添加公司电子印章,并调整印章日期为实际补签日期(非原合同日期),生成符合归档要求的完整文件。
个人办理社保转移、学历认证等业务时,需要将身份证复印件加盖单位公章后上传系统。将身份证扫描件 PDF 导入,在空白处插入单位电子印章(需提前获取透明 PNG 格式的章图),调整至不遮挡证件信息的位置,导出后直接上传政务平台,避免线下跑腿。
| 维度 | 本工具 | 竞品 A (Adobe Acrobat) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 需上传至 Adobe 云服务器处理 | 文件需发送给第三方或打印店,泄露风险高 |
| 处理速度 | 1-3 秒内完成 | 3-10 秒(取决于上传下载速度) | 数小时到数天(包含沟通与物流时间) |
| 离线可用 | 完全支持离线使用 | 需联网,无法离线操作 | 完全离线(需当面交接) |
| 收费模式 | 完全免费,无水印 | 需付费订阅(按月/年) | 按次收费,或包含在打印/服务费中 |
| 使用门槛 | 无需注册,打开即用 | 需注册 Adobe ID 并安装软件 | 需找到服务商并沟通需求 |
| 操作复杂度 | 上传 PDF → 拖拽签名 → 下载 | 安装软件 → 创建签名 → 放置 → 保存 | 打印 → 手写签名 → 扫描 → 发送电子版 |
| 文件大小限制 | 无明确限制,受浏览器内存影响 | 单文件最大 2GB | 无限制(取决于打印机和扫描仪) |
| 签名样式 | 支持上传任意图片作为签名/印章 | 提供手写签名、文字签名、图片签名 | 仅限手写或实体印章 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 一份 3 页的 PDF 合同(contract.pdf),在末页签名处添加一个手写签名图片(signature.png) | 输出一个 3 页的 PDF,末页指定位置出现签名图片,其余页面内容不变 | 典型场景:合同签署,仅需在最后一页签名 |
| 一个 50 页的 PDF 报告(report.pdf),在每一页右下角添加公司公章图片(stamp.png) | 输出一个 50 页的 PDF,每页右下角均有公章图片,位置统一 | 典型场景:批量盖章,每页重复添加同一元素 |
| 一个 1 页的 PDF(form.pdf),在指定坐标 (100, 200) 处添加一个签名图片(sign.png),图片缩放至 50% | 输出一个 1 页的 PDF,签名图片位于 (100, 200) 处,大小为原图的 50% | 边界 case:精确控制签名位置和大小 |
| 一个空白的 PDF(仅一页白纸),添加一个印章图片(seal.png) | 输出一个 1 页的 PDF,白纸上出现印章图片 | 边界 case:输入 PDF 无内容,仅作为画布 |
| 一个加密的 PDF(password.pdf),需要密码才能打开 | 工具提示:无法处理加密 PDF,请先解密后再上传 | 易错 case:加密 PDF 无法直接添加签名 |
| 一个扫描件 PDF(scan.pdf),图片格式内嵌,无文本层,添加签名图片 | 输出一个 PDF,扫描件页面叠加签名图片,原扫描内容不变 | 典型场景:扫描件合同,直接叠加签名 |
| 一个 100 MB 的超大 PDF(large.pdf),添加一个签名图片 | 输出一个约 100 MB 的 PDF,签名图片叠加成功,处理时间较长 | 边界 case:大文件处理,考验工具稳定性 |
| 一个 PDF,其中签名图片文件名包含中文(如“张三签名.png”) | 输出一个 PDF,签名图片正常显示,中文文件名无乱码 | 易错 case:中文文件名兼容性 |
用白底 JPG 签名图(如 white_signature.jpg)直接覆盖在 PDF 上使用透明背景的 PNG 签名图(如 signature.png),或先将 JPG 去底转为 PNGJPG 不支持透明通道,白底会遮挡 PDF 原有文字/背景;PNG 透明通道让签名自然浮在页面上
用 4000×3000 像素的扫描签名图(5MB+)签名图控制在 300-600 像素宽,72-150 DPI,文件大小 < 200KBPDF 中嵌入高分辨率位图会线性增加文件体积;签名只需清晰可辨,无需印刷级精度
上传 signature.bmp 或 signature.tiff上传 PNG、JPG 或 WebP 格式的签名图BMP/TIFF 未压缩且浏览器原生支持差;PNG/WebP 压缩率高且浏览器可直接处理,减少上传和转换耗时
签名图尺寸 800×400 像素,但 PDF 签名区域只有 200×100 像素先裁剪签名图到合适比例(如 300×150 像素),或使用工具内置的缩放功能过大签名图会覆盖周围文字/表格;签名区域通常只占页面一小块,图应恰好嵌入预留位置
用手机自拍签名照片,文字在照片中是镜像的用扫描仪或文档拍照 App 获取正向签名,或在上传前用图片编辑翻转修正手机前置摄像头拍签名会左右镜像;后置摄像头正常但需注意光线和角度,避免变形
上传一张 A4 合同扫描件(如 contract_page1.jpg)作为签名只上传包含签名的局部区域(如签名栏的截图或单独签名的照片)工具预期接收的是签名/印章图片,不是整页文档;整页图会被缩放成一个图章大小,完全不可读
签名图四周有大量白边(签名只占图片 10% 区域)用图片编辑裁剪掉签名周围的空白,让签名占图片 80%+ 面积空白边缘会导致签名在 PDF 中显示过小或位置偏移;裁剪后定位更精准,视觉效果更专业
把圆形印章图强制拉伸成 200×100 像素(椭圆变形)保持原图宽高比,或使用正方形画布(如 300×300 像素)放置圆形印章圆形印章被拉伸后变成椭圆,失去真实感;保持宽高比才能呈现原样圆形或方形印章
公式推导 · 流程图解 · 依据出处
S = I(x, y) ⊕ M(x, y)
S — 签名后的最终图像像素矩阵I — 原始 PDF 页面图像像素矩阵M — 签名/印章图像像素矩阵(含透明度通道)⊕ — 图像叠加运算(Alpha 混合)用户上传一份合同 PDF(A4 尺寸,300 DPI,像素矩阵 I 为 2480×3508),选择一张已抠图的 PNG 签名图片(像素矩阵 M 为 400×200,含透明度通道)。工具将 M 缩放到用户指定的位置(如右下角坐标 x=2000, y=3100),执行 Alpha 混合运算:S(x,y) = α·M(x,y) + (1-α)·I(x,y),其中 α 为 M 的透明度值。最终生成包含签名的新 PDF 页面图像。
适用于任意 PDF 文档添加电子签名或印章图片。不适用于需要数字证书认证的电子签名(如 PKI 签名),也不适用于对已加密或受 DRM 保护的 PDF 进行修改。基于标准图像 Alpha 混合算法(Porter-Duff 合成),兼容常见 PNG/JPEG 签名图片格式。
3 种主流语言 · 复制即用
from PyPDF2 import PdfReader, PdfWriter
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import io
# 1. 创建签名图片的 PDF 覆盖层(透明背景)
signature_path = "signature.png" # 签名图片文件
output_pdf = "signed_document.pdf"
input_pdf = "original.pdf"
# 生成签名覆盖页(A4 大小,签名放在右下角)
packet = io.BytesIO()
c = canvas.Canvas(packet, pagesize=letter)
c.drawImage(signature_path, 400, 50, width=150, height=60, mask='auto')
c.save()
packet.seek(0)
overlay = PdfReader(packet)
# 2. 合并到原 PDF 每一页
reader = PdfReader(input_pdf)
writer = PdfWriter()
for page in reader.pages:
page.merge_page(overlay.pages[0])
writer.add_page(page)
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"签名完成:{output_pdf}")package main
import (
"github.com/pdfcpu/pdfcpu/pkg/api"
"github.com/pdfcpu/pdfcpu/pkg/pdfcpu"
"github.com/pdfcpu/pdfcpu/pkg/types"
"image"
_ "image/png"
"os"
)
func main() {
// 读取签名图片
imgFile, _ := os.Open("signature.png")
defer imgFile.Close()
img, _, _ := image.Decode(imgFile)
// 配置签名位置(右下角,单位:点)
pos := types.Rectangle{LLx: 400, LLy: 50, URx: 550, URy: 110}
watermark := pdfcpu.Watermark{
Image: img,
Pos: pos,
Opacity: 1.0,
OnTop: true,
}
// 应用到 PDF 所有页面
if err := api.AddWatermarksFile("original.pdf", "", "signed.pdf", watermark, nil, nil); err != nil {
panic(err)
}
println("签名完成:signed.pdf")
}const { PDFDocument } = require('pdf-lib');
const fs = require('fs');
async function signPDF() {
// 读取原 PDF 和签名图片
const pdfBytes = fs.readFileSync('original.pdf');
const signatureBytes = fs.readFileSync('signature.png');
const pdfDoc = await PDFDocument.load(pdfBytes);
const signatureImage = await pdfDoc.embedPng(signatureBytes);
// 获取所有页面并添加签名
const pages = pdfDoc.getPages();
for (const page of pages) {
page.drawImage(signatureImage, {
x: 400,
y: 50,
width: 150,
height: 60,
opacity: 0.9,
});
}
// 保存
const signedBytes = await pdfDoc.save();
fs.writeFileSync('signed.pdf', signedBytes);
console.log('签名完成:signed.pdf');
}
signPDF().catch(console.error);9 个高频疑问