现在时间是:
当前位置:首 页 >> 数据分析>> 文章列表

使用pyPdf给PDF文件加水印

作者:   发布时间:2016-11-15 12:44:14   浏览次数:1851

 利用的是pyPdf库的PDF页面合并(叠加)功能(merging documents page by pag),即将原始PDF页面与水印PDF页面进行叠加。

直接上码:

  1. # coding: utf-8  
  2. # pdf_watermark.py  
  3.   
  4. import os  
  5. # http://pybrary.net/pyPdf/  
  6. from pyPdf import PdfFileWriter, PdfFileReader  
  7. # http://www.reportlab.com  
  8. from reportlab.pdfgen import canvas  
  9.   
  10. def create_watermark(content):  
  11.     """创建PDF水印模板 
  12.     """  
  13.     # 使用reportlab来创建一个PDF文件来作为一个水印文件   
  14.     c = canvas.Canvas('watermark.pdf')   
  15.     c.setFont('Courier'10)   
  16.   
  17.     # 设置水印文件  
  18.     c.saveState()   
  19.     c.translate(30015)   
  20.     # 水印文字  
  21.     c.drawCentredString(00, content)   
  22.     c.restoreState()   
  23.     # 保存水印文件  
  24.     c.save()  
  25.     pdf_watermark = PdfFileReader(file('watermark.pdf''rb'))  
  26.     return pdf_watermark  
  27.   
  28. def add_watermark(pdf_file, pdf_watermark, output_dir='output', max_page=5):  
  29.     """给指定PDF文件文件加上水印 
  30.     pdf_file - 要加水印的源PDF文件 
  31.     pdf_watermark - PDF水印模板 
  32.     max_page - 加水印的最大页数 
  33.     """  
  34.     pdf_output = PdfFileWriter()  
  35.     input_stream = file(pdf_file, 'rb')  
  36.     pdf_input = PdfFileReader(input_stream)  
  37.       
  38.     # PDF文件被加密了  
  39.     if pdf_input.getIsEncrypted():  
  40.     print '该PDF文件被加密了.'  
  41.     # 尝试用空密码解密  
  42.     try:  
  43.         pdf_input.decrypt('')  
  44.     except Exception, e:  
  45.         print '尝试用空密码解密失败.'  
  46.         return False  
  47.     else:  
  48.         print '用空密码解密成功.'  
  49.   
  50.     # 获取PDF文件的页数   
  51.     pageNum = pdf_input.getNumPages()   
  52.     # 给每一页打水印   
  53.     for i in range(pageNum):  
  54.         page = pdf_input.getPage(i)  
  55.         if i < max_page:  
  56.             # 只给前max_page页加水印  
  57.             page.mergePage(pdf_watermark.getPage(0))   
  58.         pdf_output.addPage(page)  
  59.   
  60.     # 最后输出文件   
  61.     output_stream = file(os.path.join(output_dir, os.path.basename(pdf_file)), 'wb')   
  62.     pdf_output.write(output_stream)   
  63.     output_stream.close()  
  64.     input_stream.close()  
  65.     return True  
  66.   
  67. if __name__ == '__main__':  
  68.     # 创建水印文件  
  69.     pdf_watermark = create_watermark('www.site-digger.com')  
  70.     add_watermark('HLMP_6405_J0011.pdf', pdf_watermark)  

可以分享的经验是:

不少PDF文件被加密了,需要先解密才能加上水印,幸运的是好多密码直接是空的。

上述程序在处理一个PDF前会先判断其是否被加密了,如果是则尝试用空密码进行解密。

 

无图无真相:

 

这是原始的PDF

 

这是水印PDF

 

这是处理后(叠加)的效果

 






上一篇:没有了    下一篇:没有了

Copyright ©2018    易一网络科技|www.yeayee.com All Right Reserved.

技术支持:自助建站 | 领地网站建设 |短信接口 版权所有 © 2005-2018 lingw.net.粤ICP备16125321号 -5