Cropping Seiten einer PDF-Datei
Frage
Ich habe mich gefragt, ob jemand Erfahrung hatte programmatisch mit PDF-Dateien zu arbeiten. Ich habe eine PDF-Datei, und ich muß jede Seite zuzuschneiden bis zu einer bestimmten Größe.
Nach einer schnellen Google-Suche fand ich die pyPdf Bibliothek für Python, aber meine Experimente mit ihm versagt. Wenn änderte ich den CropBox und Trimbox Attribute auf einer Seite Objekt wurden die Ergebnisse nicht, was ich erwartet hatte, und schien ganz zufällig zu sein.
Hat jemand Erfahrung mit diesem hatte? Codebeispiele würden in Python gut geschätzt, bevorzugt werden.
Lösung
pypdf tut, was ich in diesem Bereich erwarten. Verwenden Sie das folgende Skript:
#!/usr/bin/python
#
from pyPdf import PdfFileWriter, PdfFileReader
with open("in.pdf", "rb") as in_f:
input1 = PdfFileReader(in_f)
output = PdfFileWriter()
numPages = input1.getNumPages()
print "document has %s pages." % numPages
for i in range(numPages):
page = input1.getPage(i)
print page.mediaBox.getUpperRight_x(), page.mediaBox.getUpperRight_y()
page.trimBox.lowerLeft = (25, 25)
page.trimBox.upperRight = (225, 225)
page.cropBox.lowerLeft = (50, 50)
page.cropBox.upperRight = (200, 200)
output.addPage(page)
with open("out.pdf", "wb") as out_f:
output.write(out_f)
Das resultierende Dokument hat eine Trimm-Box, die 200x200 Punkte und beginnt bei 25,25 Punkten in der Media-Box. Die Ernte Feld ist 25 Punkte in der Trimmbox.
Hier ist, wie mein Beispieldokument in Acrobat nach der Verarbeitung mit dem obigen Code professionell aussieht:
Dieses Dokument wird leer angezeigt, wenn in Acrobat Reader geladen.
Andere Tipps
Hier können Sie die Dimension von pdf erhalten
from PyPDF2 import PdfFileWriter,PdfFileReader,PdfFileMerger
pdf_file = PdfFileReader(open("/Users/user.name/Downloads/sample.pdf","rb"))
page = pdf_file.getPage(0)
print(page.cropBox.getLowerLeft())
print(page.cropBox.getLowerRight())
print(page.cropBox.getUpperLeft())
print(page.cropBox.getUpperRight())
Nach dieser Seite Verweis erhalten und dann Ernte Befehl anwenden
page.mediaBox.lowerRight = (lower_right_new_x_coordinate, lower_right_new_y_coordinate)
page.mediaBox.lowerLeft = (lower_left_new_x_coordinate, lower_left_new_y_coordinate)
page.mediaBox.upperRight = (upper_right_new_x_coordinate, upper_right_new_y_coordinate)
page.mediaBox.upperLeft = (upper_left_new_x_coordinate, upper_left_new_y_coordinate)
#for example :- my custom coordinates
#page.mediaBox.lowerRight = (611, 500)
#page.mediaBox.lowerLeft = (0, 500)
#page.mediaBox.upperRight = (611, 700)
#page.mediaBox.upperLeft = (0, 700)
Sie suchen wahrscheinlich für eine kostenlose Lösung, aber wenn Sie Geld ausgeben, PDFlib ist eine fabelhafte Bibliothek. Es hat mich nie enttäuscht.
Sie können die PDF in Postscript (pstopdf oder ps2pdf) umwandeln und als Verwendung Textverarbeitung auf der Postscript-Datei. Danach können Sie die Ausgabe zurück in PDF umwandeln kann.
Das funktioniert gut, wenn die PDF-Dateien Sie bearbeiten wollen, dass alle von der gleichen Anwendung generiert werden und sind ein wenig ähnlich. Wenn sie aus verschiedenen Quellen kommen, ist es in der Regel schwer, die Postscript-Dateien zu verarbeiten - die Struktur zu viel variiert. Aber selbst, als Sie migt die Lage sein, Seitengrößen und dergleichen mit einem paar regulären Ausdrücke zu beheben.
Acrobat Javascript API hat eine setPageBoxes Methode, aber Adobe bietet keine Python Code-Beispiele. Nur C ++, C # und VB.