>>> 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()
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