41 Stimmen

Extrahieren von Seitengrößen aus PDF in Python

Ich möchte eine PDF-Datei lesen und eine Liste der Seiten und der Größe der einzelnen Seiten erhalten. Ich muss es nicht in irgendeiner Weise manipulieren, nur lesen.

Derzeit versuchen, pyPdf und es tut alles, was ich brauche, außer einen Weg, um Seitengrößen zu erhalten. Verstehen, dass ich wahrscheinlich haben, um durch zu iterieren, wie Seitengrößen in einem PDF-Dokument variieren können. Gibt es eine andere Libray/Methode, die ich verwenden kann?

Ich habe es mit PIL versucht, einige Online-Rezepte haben sogar d=Image(imagefilename) verwendet, aber es liest KEINE meiner PDFs - es liest alles andere, was ich ihm vorlege - sogar einige Dinge, von denen ich nicht wusste, dass PIL sie kann.

Jede Anleitung geschätzt - ich bin auf Windows 7 64, python25 (weil ich auch GAE Zeug tun), aber ich bin glücklich, es in Linux oder moderner pythiis zu tun.

58voto

Josh Lee Punkte 159535

Dies kann geschehen mit PyPDF2 :

>>> from PyPDF2 import PdfReader
>>> reader = PdfReader('example.pdf')
>>> reader.pages[0].mediabox
RectangleObject([0, 0, 612, 792])

(Ehemals bekannt als pyPdf .)

25voto

cges30901 Punkte 380

Aktualisierung am 2021-07-22: Die ursprüngliche Antwort war nicht immer korrekt, daher aktualisiere ich meine Antwort.

Mit PyMuPDF :

>>> import fitz
>>> doc = fitz.open("example.pdf")
>>> page = doc[0]
>>> print(page.rect.width, page.rect.height)
842.0 595.0
>>> print(page.mediabox.width, page.mediabox.height)
595.0 842.0

Rückgabewerte von mediabox y rekt sind vom Typ Rechteck das die Attribute "Breite" und "Höhe" hat. Ein Unterschied zwischen mediabox und rect ist, dass mediabox dasselbe ist wie /MediaBox im Dokument und sich nicht ändert, wenn die Seite gedreht wird. rect hingegen wird von der Drehung beeinflusst. Für weitere Informationen über die verschiedenen Boxen in PyMuPDF lesen Sie bitte glossar .

17voto

Jamy Mahabier Punkte 350

Mit pdfrw :

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

Die Längen werden in Punkten angegeben (1 pt = 1/72 inch). Das Format ist [x0, y0, x1, y1] (Danke, mara004!).

7voto

Myonaiz Punkte 310

Für pdfminer python 3.x (pdfminer.six) (habe es nicht mit python 2.7 versucht):

parser = PDFParser(open(pdfPath, 'rb'))
doc = PDFDocument(parser)
pageSizesList = []
for page in PDFPage.create_pages(doc):
    print(page.mediabox) # <- the media box that is the page size as list of 4 integers x0 y0 x1 y1
    pageSizesList.append(page.mediabox) # <- appending sizes to this list. eventually the pageSizesList will contain list of list corresponding to sizes of each page

7voto

mara004 Punkte 407

Mit pikepdf:

import pikepdf

# open the file and select the first page
pdf = pikepdf.Pdf.open("/path/to/file.pdf")
page = pdf.pages[0]

if '/CropBox' in page:
    # use CropBox if defined since that's what the PDF viewer would usually display
    relevant_box = page.CropBox
elif '/MediaBox' in page:
    relevant_box = page.MediaBox
else:
    # fall back to ANSI A (US Letter) if neither CropBox nor MediaBox are defined
    # unlikely, but possible
    relevant_box = [0, 0, 612, 792]

# actually there could also be a viewer preference ViewArea or ViewClip in
# pdf.Root.ViewerPreferences defining which box to use, but most PDF readers 
# disregard this option anyway

# check whether the page defines a UserUnit
userunit = 1
if '/UserUnit' in page:
    userunit = float(page.UserUnit)

# convert the box coordinates to float and multiply with the UserUnit
relevant_box = [float(x)*userunit for x in relevant_box]

# obtain the dimensions of the box
width  = abs(relevant_box[2] - relevant_box[0])
height = abs(relevant_box[3] - relevant_box[1])

rotation = 0
if '/Rotate' in page:
    rotation = page.Rotate

# if the page is rotated clockwise or counter-clockwise, swap width and height
# (pdf rotation modifies the coordinate system, so the box always refers to 
# the non-rotated page)
if (rotation // 90) % 2 != 0:
    width, height = height, width

# now you have width and height in points
# 1 point is equivalent to 1/72in (1in -> 2.54cm)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X