经常需要向PDF文档签名,online版本多数都开始收费了,并且用鼠标画签名效果很难看。最后索性用Python开发了一个工具,拍下签名照片就可以放到PDF文档某页某个地方。开始熟悉这个仓库可能需要一定时间,但熟悉之后使用起来就非常方便了。一张签名照片,签遍PDF文档。
仓库网址:https://github.com/MengWoods/sign-pdf-with-transparent-background-signature
工作原理
大致的思路原理:
- 用CV二值化签名照片,提取深色的签名。
- 用PDF相关的库把输入文档拆分成单个页。
- 用CV读取需要签名的页码,在指定图片位置将签名与该PDF页重合merge。
- 用PDF库将所有的单页文档组合成完整的PDF文件。
- 清理过程中产生的中间文件。
快速上手
- 克隆仓库后, 安装必要的依赖库:
pip install -r requirements.txt
- 给样例文档签名, 运行:
python main.py -t signature -i example-pdf.pdf -s example-signature.jpg -c 0.2 -n 2 -o 0.65,0.72
- 可以在
.files
文件夹下查看签名后的文档效果.
下面是仓库原有Readme:
介绍
该工具接受PDF文件和签名图片作为输入,并输出已签名的PDF文件。
示例结果:
在上面的图片中,您可以看到输入照片和输出结果的示例,完整的签名PDF文件可以在仓库路径files/example-pdf_signed.pdf中找到。
多数在线签名网站或工具是收费或限制使用次数的。该项目允许您无限制地使用。经过本人测试,该工具运行良好,可以取代许多在线签名网站。如果在使用中发现任何问题,请提交问题,如果您喜欢它或认为它有帮助,请考虑为该项目点赞。感谢您的贡献。
使用
在Python 3.X环境中,使用pip install -r requirements.txt
安装依赖项。
将输入文件放到./files
文件夹中,然后使用python main.py -h
命令来检查参数的含义。以下是签署PDF的基本参数:
'-b','--base-path',default='./files',type=str,help='要处理的PDF文件的基本路径'
'-t','--type-of-manipulation',required=True,type=str,
choices=['ocr','merge','split','watermark','signature'],
help="PDF操作的类型"
'-i','--input-files',required=True,nargs='+',help="输入PDF文件名,两个文件之间加一个空格"
'-s','--signature-file',type=str,help="签名图片文件名"
'-n','--signature-page-num',type=int,default=1,help="PDF文件的签名页码[1,+Inf)"
'-o','--signature-offset-xy',type=parse_two_numbers,default=[0,0],help="签名的x和y坐标的偏移比例。范围是[0,1]"
'-c','--signature-scale',type=float,default=1,help="缩放输入签名文件的比例(0,+inf),如果需要旋转签名,请将其设置为负值"
'-g','--gray-threshold',type=float,default=100,help="处理签名图像的灰度阈值[0,255]"
签名
- 拍摄一个个人签名照片,例如示例图片。
- 将签名照片和PDF文件放到
./files
文件夹中。 - 选择签名页码(-n)、灰度阈值(-g)、缩放(-c)和偏移比例(-o),后两个参数可能需要尝试几次以获得最佳结果。
- 页码从1开始。
- 灰度阈值的范围是[0,255],用于从照片中提取签名,对于大多数情况来说,默认值应该足够。如果不行,请进行调整并检查结果。
- 缩放的范围是[0,+inf),通常需要缩小签名的大小,例如0.3。将其设置为负值将旋转签名。
- 偏移比例按X,Y顺序排列,PDF页面的左上角是原点,Y是水平的,X是垂直的。范围是[0,1]。参见下图作为参考。
- 使用以上所述内容,运行程序进行签署。下面是使用此命令签署示例PDF的示例:
python main.py -t signature -i example-pdf.pdf -s example-signature.jpg -c 0.2 -n 2 -o 0.65,0.72
其他
以下是一些其他用法示例,假设您的输入文件位于./files文件夹中:
- OCR pdf并保存为txt文件
python main.py -t ocr -i a.pdf
- 将多个PDF合并为一个PDF文件
python main.py -t merge -i a.pdf b.pdf
- 将一个PDF拆分成多个PDF文件
python main.py -t split -i a.pdf
- 将水印添加到PDF文件的所有页面
python main.py -t watermark -i a.pdf -w watermark.pdf
;仅将水印添加到第一页(或最后一页)python main.py -t watermakr -i a.pdf -w watermark.pdf -p first
- 欢迎测试并反馈,谢谢。