每一个PDF页面都有自己的尺寸,在pypdf2中,PageObject对象的mediabox属性存储的是就是该页面的尺寸信息,对应的是一个RectangleObject对象。RectangleObject对象的left、bottom、right、top四个属性分别代表左、下、右、上四边的距离,我们可以把一个PDF页面的左下角当成是坐标原点,而RectangleObject的四个属性分别是四条边到达坐标轴的距离。
我还是举一个例子看一下吧:
from PyPDF2 import PdfReaderreader = PdfReader( "./pdf_ files/练习文档.pdf") page = reader.getPage(0) print(page.mediabox)# 输出: RectangleObject([0, 0, 612, 792]) print(page.mediabox.left)# 输出: 0 print(page.mediabox.bottom)# 输出: 0 print(page.mediabox.right)# 输出: 612 print(page.mediabox.top)# 输出: 792
代码中读取了“练习文档.pdf”的第一页的mediabox属性,该文档是信纸的尺寸,约等于612磅×792磅,我们把它放到坐标图里看一下,如图9-2所示。
现在通过坐标图我们可以更容易理解RectangleObject左、下、右、上四个属性所表示的含义了,所以修改这几个属性实际上就是修改页面的尺寸。
比如说我们要把信纸的尺寸修改为A4纸的尺寸,只要把PageObject对象的mediabox 重新赋值为一个指定四边距离的RectangleObject对象即可,注意这四边距离是一个元组,代码如下:
from PyPDF2 import PdfReader, PdfWriterfrom PyPDF2.generic import RectangleObjectreader = PdfReader( "./pdf_ files/练习文档.pdf") writer = PdfWriter() for page in reader.pages: page.mediabox = RectangleObject((0, 0, 595.28, 841.89)) writer.addPage(page) with open("./pdf_ files/test.pdf", "wb") as f: writer.write(f)
如果不想自己实例化RectangleObject对象也是可以的,PageObject对象有提供一些缩放方法,比如说scaleTo()方法可以直接指定宽高,代码如下:
from PyPDF2 import PdfReader, PdfWriterreader = PdfReader( "./pdf_ files/练习文档.pdf") writer = PdfWriter() for page in reader.pages: page.scaleTo(595.28, 841.89) writer.addPage(page) with open("./pdf_ files/test.pdf", "wb") as f: writer.write(f)
PageObject对象的scaleBy()方法可以按某个比例因子对页面进行等比缩放,比例因子就是指缩放的倍数,比如说把所有页面的宽高都缩小为原来的50%,代码如下:
from PyPDF2 import PdfReader, PdfWriterreader = PdfReader( "./pdf_ files/练习文档.pdf") writer = PdfWriter() for page in reader.pages: page.scaleBy(0.5) writer.addPage(page) with open("./pdf_ files/test.pdf", "wb") as f: writer.write(f)