ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用 PyPDF2 + reportlab 批量给多份装修合同 PDF 加骑缝水印和页码(附完整代码)

用 PyPDF2 + reportlab 批量给多份装修合同 PDF 加骑缝水印和页码(附完整代码) 做装修项目最怕两件事合同版本混乱、纸质件被调包。把多份合同 PDF 统一加上骑缝水印 连续页码既能防篡改又能让归档一目了然。本文用一个纯 Python 脚本读完即可跑。为什么不用在线工具装修合同含业主姓名、电话、身份证号、房屋地址属于敏感个人信息。丢给第三方网站处理有泄露风险。本地用PyPDF2reportlab就能搞定零外传。环境pipinstallPyPDF2 reportlab核心思路用reportlab生成一张透明水印 PDF含水印文字 页码占位。用PyPDF2的PdfWriter把水印叠到每一页上merge_page。页码用PdfReader逐页计数写入页脚。遍历整个文件夹批量处理。完整代码importosimportglobfromPyPDF2importPdfReader,PdfWriterfromreportlab.pdfgenimportcanvasfromreportlab.lib.pagesizesimportA4 WATERMARK麦序子 · 装修合同 · 机密defmake_stamp(text,page_no,total,outstamp.pdf):生成单页水印(透明背景) pdf含斜向水印文字与页码。ccanvas.Canvas(out,pagesizeA4)c.setFillAlpha(0.18)# 透明不挡正文c.setFont(Helvetica-Bold,26)c.saveState()c.translate(A4[0]/2,A4[1]/2)c.rotate(45)c.drawCentredString(0,0,text)c.restoreState()# 页脚页码c.setFillAlpha(0.9)c.setFont(Helvetica,9)c.drawString(40,20,f{page_no}/{total})c.save()returnoutdefadd_watermark(src,dst):readerPdfReader(src)writerPdfWriter()totallen(reader.pages)fori,pageinenumerate(reader.pages,1):stampmake_stamp(WATERMARK,i,total)swPdfReader(stamp)page.merge_page(sw.pages[0])writer.add_page(page)withopen(dst,wb)asf:writer.write(f)print(f已处理:{os.path.basename(src)}-{dst}({total}页))defbatch(folder,out_dir):os.makedirs(out_dir,exist_okTrue)forpathinglob.glob(os.path.join(folder,*.pdf)):nameos.path.splitext(os.path.basename(path))[0]add_watermark(path,os.path.join(out_dir,f{name}_wm.pdf))if__name____main__:batch(rD:/合同原始,rD:/合同归档)三个常见坑中文水印乱码reportlab默认 Helvetica 不带中文字形。注册STSong-LightAdobe 自带 CJK 字体或换用matplotlib出图再叠才能正常显示中文水印。merge_page 后内容被盖setFillAlpha调低到 0.15 左右水印只做底纹不挡签字区。大文件慢逐页merge_page是 CPU 活几百页的合同建议多进程分桶处理别一把梭。小结本地批量加水印 页码几百份合同十分钟归档完敏感信息不出本机。需要把清单计价表也一起标准化归档可以参考 maixuzi.cn/resources/ 上的装修文档处理思路。
返回列表