python之通过 reportlab库给PDF文件添加水印

文章展示了如何使用Python的reportlab和PyPDF4库向PDF文件添加文字水印和页码。首先,创建一个带有旋转文字的水印,然后将水印合并到PDF页面上。接着,演示了如何为PDF文件批量添加页码。
摘要由CSDN通过智能技术生成

添加页码和水印

水印是纸质或者电子文档上的图像或图案,是一种个人和组织的象征。一些水印只能在特殊照明条件下才能看到。下面是向PDF添加水印方法:

添加文字水印

>>> from reportlab.pdfgen import canvas
>>> from reportlab.lib.units import cm
>>> from reportlab.pdfbase import pdfmetrics
>>> from reportlab.pdfbase.ttfonts import TTFont
>>>
>>> from PyPDF4 import PdfFileWriter,PdfFileReader
>>> content = "Hello"

默认大小为21cm*29.7cm

>>> c = canvas.Canvas('./pdf_file/mark.pdf', pagesize = (30*cm, 30*cm))

移动坐标原点(坐标系左下为(0,0)))

>>> c.translate(10*cm, 10*cm)

灰色

>>> c.setFillColorRGB(0.5,0.5,0.5)

旋转45度,坐标系被旋转

>>> c.rotate(45)
>>> c.drawString(-7*cm, 0*cm, content)
>>> c.drawString(7*cm, 0*cm, content)
>>> c.drawString(0*cm, 7*cm, content)
>>> c.drawString(0*cm, -7*cm, content)

关闭并保存pdf文件

>>> c.save()

使用文件添加水印

>>> input_pdf = './pdf_file/demo1.pdf'
>>> output_pdf = './pdf_file/abc.pdf'
>>> watermark_pdf = './pdf_file/mark.pdf'
>>> watermark = PdfFileReader(watermark_pdf)
>>> watermark_page = watermark.getPage(0)
>>> pdf = PdfFileReader(input_pdf,strict=False)
>>> pdf_writer = PdfFileWriter()
>>> for page in range(pdf.getNumPages()):
>>>     pdf_page = pdf.getPage(page)
>>>     pdf_page.mergePage(watermark_page)
>>>     pdf_writer.addPage(pdf_page)
>>> pdfOutputFile = open(output_pdf,'wb')
>>> pdf_writer.encrypt('hello')
>>> pdf_writer.write(pdfOutputFile)
>>> pdfOutputFile.close()

添加页码

也添加水印相同,使用文件添加页码。

>>> from reportlab.lib.units import mm
>>> import os,sys
>>>
>>> path = './pdf_file/demo1.pdf'
>>>
>>> base = os.path.basename(path)
>>> tmp = "__tmp.pdf"
>>>
>>> batch = 10
>>> batch = 0
>>> output = PdfFileWriter()
>>> with open(path, 'rb') as f:
>>>     pdf = PdfFileReader(f,strict=False)
>>>     n = pdf.getNumPages()
>>>     if batch == 0:
>>>         batch = -n
>>>     c = canvas.Canvas(tmp)
>>>     for i in range(1,n+1):
>>>         c.drawString((210//2)*mm, (4)*mm, str(i))
>>>         c.showPage()
>>>     c.save()
>>>     with open(tmp, 'rb') as ftmp:
>>>         numberPdf = PdfFileReader(ftmp)
>>>         for p in range(n):
>>>             print('page: %d of %d'%(p, n))
>>>             page = pdf.getPage(p)
>>>             numberLayer = numberPdf.getPage(p)
>>>
>>>             page.mergePage(numberLayer)
>>>             output.addPage(page)
>>>         if output.getNumPages():
>>>             newpath = path.replace(base,  base[:-4] + '_page_%d'%(p//batch + 1)  + path[-4:])
>>>             with open(newpath, 'wb') as f:
>>>                 output.write(f)
>>>     os.remove(tmp)
page: 0 of 2
page: 1 of 2

Python添加PDF水印通常涉及到处理PDF文档的,如PyPDF2或PDFMiner。这里是一个简单的步骤概述: 1. **安装必要的**:首先需要安装`reportlab`,它包含了一个叫做`Image`的模块,可以用于创建图像并插入到PDF中作为水印。 ```bash pip install reportlab ``` 2. **读取原始PDF**:使用`PyPDF2`读取PDF文件内容,如果需要的话。 ```python from PyPDF2 import PdfFileReader # 加载PDF with open('input.pdf', 'rb') as file: reader = PdfFileReader(file) ``` 3. **创建水印图像**:你可以使用`PIL`(Pillow)创建水印图片。例如,设置文本水印: ```python from PIL import Image, ImageDraw, ImageFont # 创建一个背景透明的白底图像 img = Image.new('RGBA', (100, 100), (255, 255, 255, 0)) draw = ImageDraw.Draw(img) font = ImageFont.truetype('arial.ttf', size=48) # 根据需求调整字体大小 text = "Watermark" w, h = draw.textsize(text, font) x = (img.width - w) // 2 y = (img.height - h) // 2 draw.text((x, y), text, fill=(0, 0, 0, 128)) # 设置颜色和透明度 watermark_image = img ``` 4. **将水印插入PDF**:利用`reportlab`水印图像插入每一页。 ```python from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas # 新建一个canvas c = canvas.Canvas("output.pdf", pagesize=letter) # 遍历每一页 for page_num in range(reader.getNumPages()): c.drawImage(watermark_image, x=100, y=750) # 调整位置 # 如果有原PDF页面,则合并 if page_num < reader.getNumPages(): c.drawInlineImage(reader.getPage(page_num).extractImage(), 10, 10) # 保存新的PDF c.save() ``` **相关问题**: 1. 如何防止PDF水印被轻松移除? 2. `reportlab`是否有其他功能可用于PDF操作? 3. 对于复杂的水印设计,如何使用`reportlab`实现?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值