0、用到两个扩展模块:ReportLab、PyPDF2。
1、创建水印PDF。
1)、创建文字水印pdf文件
代码:
#encoding=utf-8 #author: walker #date: 2014-03-17 #function: 创建文字水印pdf from reportlab.pdfgen import canvas from reportlab.lib.units import cm def create_watermark(content): #默认大小为21cm*29.7cm c = canvas.Canvas("mark.pdf", pagesize = (30*cm, 30*cm)) #移动坐标原点(坐标系左下为(0,0)) c.translate(10*cm, 5*cm) #设置字体 c.setFont("Helvetica", 80) #指定描边的颜色 c.setStrokeColorRGB(0, 1, 0) #指定填充颜色 c.setFillColorRGB(0, 1, 0) #画一个矩形 c.rect(cm, cm, 7*cm, 17*cm, fill=1) #旋转45度,坐标系被旋转 c.rotate(45) #指定填充颜色 c.setFillColorRGB(0.6, 0, 0) #设置透明度,1为不透明 c.setFillAlpha(0.3) #画几个文本,注意坐标系旋转的影响 c.drawString(3*cm, 0*cm, content) c.setFillAlpha(0.6) c.drawString(6*cm, 3*cm, content) c.setFillAlpha(1) c.drawString(9*cm, 6*cm, content) #关闭并保存pdf文件 c.save() create_watermark('walker')
效果图:
2)、创建图片水印pdf。
代码:
#encoding=utf-8 #author: walker #date: 2014-03-17 #function: 创建图片水印pdf from reportlab.pdfgen import canvas from reportlab.lib.units import cm def create_watermark(f_jpg): f_pdf = 'mark.pdf' w_pdf = 20*cm h_pdf = 20*cm c = canvas.Canvas(f_pdf, pagesize = (w_pdf, h_pdf)) c.setFillAlpha(0.3) #设置透明度 print c.drawImage(f_jpg, 7*cm, 7*cm, 6*cm, 6*cm) #这里的单位是物理尺寸 c.save() create_watermark('eg.png')
效果图:
2、添加水印。
代码:
#encoding=utf-8 #author: walker #date: 2014-03-18 #function:给pdf添加水印 from PyPDF2 import PdfFileWriter, PdfFileReader from reportlab.pdfgen import canvas #所有路径为绝对路径 def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out): pdf_output = PdfFileWriter() input_stream = file(pdf_file_in, 'rb') pdf_input = PdfFileReader(input_stream) # PDF文件被加密了 if pdf_input.getIsEncrypted(): print '该PDF文件被加密了.' # 尝试用空密码解密 try: pdf_input.decrypt('') except Exception, e: print '尝试用空密码解密失败.' return False else: print '用空密码解密成功.' # 获取PDF文件的页数 pageNum = pdf_input.getNumPages() #读入水印pdf文件 pdf_watermark = PdfFileReader(file(pdf_file_mark, 'rb')) # 给每一页打水印 for i in range(pageNum): page = pdf_input.getPage(i) page.mergePage(pdf_watermark.getPage(0)) page.compressContentStreams() #压缩内容 pdf_output.addPage(page)
效果图:
3、这种方式唯一的缺点就是效率极低,不适合大批量文件处理。用PDFlib处理效率会比这种方式高几十倍。可参考:用PDFlib给PDF添加水印(Python)
*** walker ***