在Python中提取PDF页面大小

38 投票
9 回答
66439 浏览
提问于 2025-04-16 18:55

我想读取一个PDF文件,并获取它的每一页以及每一页的大小。我并不需要对它进行任何操作,只是想读取内容。

目前我在尝试使用pyPdf,这个库能满足我大部分需求,除了无法获取页面大小。我知道可能需要逐页查看,因为PDF文档中的页面大小可能会有所不同。有没有其他的库或者方法可以使用呢?

我试过使用PIL,有些网上的教程甚至提到用d=Image(imagefilename)的方式,但它从来没有读取到我的PDF文件——它能读取我给它的其他所有文件,甚至一些我都不知道PIL能处理的东西。

如果有人能提供一些建议,我会很感激——我现在是在Windows 7 64位上,使用的是Python 2.5(因为我还做一些GAE的工作),不过我也乐意在Linux或者更新的Python版本上进行尝试。

9 个回答

17

使用 pdfrw 这个库:

>>> from pdfrw import PdfReader
>>> pdf = PdfReader('example.pdf')
>>> pdf.pages[0].MediaBox
['0', '0', '595.2756', '841.8898']

长度是用点来表示的(1点 = 1/72英寸)。格式是 [x0, y0, x1, y1] (感谢,mara004!)。

23

更新于2023年8月30日:提供示例pdf,添加裁剪框信息。

更新于2021年7月22日:原来的回答并不总是正确,所以我更新了我的回答。

使用PyMuPDF时:

>>> import fitz
>>> doc = fitz.open("example.pdf")
>>> page = doc[0]
>>> print(page.rect.width, page.rect.height)
284.0 473.0
>>> print(page.mediabox.width, page.mediabox.height)
595.304 841.89
>>> print(page.cropbox.width, page.cropbox.height)
473.0 284.0

在PyMuPDF中,mediaboxcropboxrect的返回值都是一种叫做Rect的类型,它有“宽度”和“高度”这两个属性。对于大多数人来说,rect可能是最有用的。

这三者在大多数情况下是相同的,但有时它们会有很大不同:cropbox和rect是页面的可见区域(也就是你在普通pdf查看器中看到的内容),而mediabox则是物理介质的大小。

cropbox和rect之间的一个区别是,cropbox在文档中与/CropBox相同,并且在页面旋转时不会改变。而rect会受到旋转的影响。想了解更多关于PyMuPDF中不同框的信息,可以查看术语表。还可以参考PDF文档 14.11.2.1。

示例pdf可以在这里下载。

57

这可以通过 pypdf 来实现:

>>> from pypdf import PdfReader
>>> reader = PdfReader('example.pdf')
>>> box = reader.pages[0].mediabox
>>> box
RectangleObject([0, 0, 612, 792])
>>> box.width
Decimal('612')
>>> box.height
Decimal('792')

(之前叫做 pyPdf / PyPDF2

撰写回答