>>> from env_helper import info; info()
页面更新时间: 2024-04-05 10:28:33
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

4.5. 添加页码和水印

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

这一节使用 reportlab 库。 在 Debian / Ubuntu 中通过以下命令安装:

sudo apt install -y python3-reportlab

下面是向PDF添加水印方法:

4.5.1. 添加文字水印

>>> from reportlab.pdfgen import canvas
>>> from reportlab.lib.units import cm
>>> from reportlab.pdfbase import pdfmetrics
>>> from reportlab.pdfbase.ttfonts import TTFont
>>>
>>> from pypdf import PdfWriter,PdfReader
>>> content = "Hello"

默认大小为21cm*29.7cm

>>> c = canvas.Canvas('./xx_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()

4.5.2. 使用文件添加水印

>>> input_pdf = './test.pdf'
>>> output_pdf = './xx_marked.pdf'
>>> watermark_pdf = './xx_mark.pdf'
>>> watermark = PdfReader(watermark_pdf)
>>> watermark_page = watermark.pages[0]
>>> pdf = PdfReader(input_pdf,strict=False)
>>> pdf_writer = PdfWriter()
>>> for page in range( len(pdf.pages)):
>>>     pdf_page = pdf.pages[page]
>>>     pdf_page.merge_page(watermark_page)
>>>     pdf_writer.add_page(pdf_page)
>>> pdfOutputFile = open(output_pdf,'wb')
>>> pdf_writer.encrypt('hello')
>>> pdf_writer.write(pdfOutputFile)
>>> pdfOutputFile.close()
_images/watermark.png

4.5.3. 添加页码

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

>>> from reportlab.lib.units import mm
>>> import os,sys
>>>
>>> path = './test.pdf'
>>>
>>> base = os.path.basename(path)
>>> tmp = "xx_tmp.pdf"
>>>
>>> batch = 10
>>> batch = 0
>>> output = PdfWriter()
>>> with open(path, 'rb') as f:
>>>     pdf = PdfReader(f,strict=False)
>>>     n = len(pdf.pages)
>>>     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 = PdfReader(ftmp)
>>>         for p in range(n):
>>>             print('page: %d of %d'%(p, n))
>>>             page = pdf.pages[p]
>>>             numberLayer = numberPdf.pages[0]
>>>
>>>             page.merge_page(numberLayer)
>>>             output.add_page(page)
>>>         if output.pages:
>>>             newpath = path.replace(base,  base[:-4] + '_page_%d'%(p//batch + 1)  + path[-4:])
>>>             print(newpath)
>>>             with open(newpath, 'wb') as f:
>>>                 output.write(f)
>>>     os.remove(tmp)
page: 0 of 4
page: 1 of 4
page: 2 of 4
page: 3 of 4
./test_page_0.pdf
_images/yema.png