Обрезка страниц в файле PDF
Вопрос
Мне было интересно, имел ли кто-нибудь опыт программной работы с файлами .pdf. У меня есть файл .pdf, и мне нужно обрезать каждую страницу до определенного размера.
После быстрого поиска в Google я нашел библиотеку pyPdf для python, но мои эксперименты с ней не увенчались успехом. Когда я изменил атрибуты cropBox и trimBox на объекте страницы, результаты оказались не такими, как я ожидал, и оказались совершенно случайными.
Кто-нибудь имел опыт работы с этим? Примеры кода были бы хорошо оценены, желательно на python.
Решение
pypdf делает то, что я ожидаю в этой области. Используя следующий скрипт:
#!/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)
Полученный документ имеет обрезную рамку размером 200x200 точек и начинается с 25,25 точки внутри медиа-блока. Внутри рамки обрезки находится поле обрезки.
Вот как выглядит мой пример документа в acrobat professional после обработки с помощью приведенного выше кода:
Этот документ будет пустым при загрузке в Acrobat Reader.
Другие советы
Используйте это, чтобы получить размер PDF
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())
После этого получите ссылку на страницу, а затем примените команду обрезки
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)
Возможно, вы ищете бесплатное решение, но если у вас есть деньги, которые можно потратить, PDFlib - это потрясающая библиотека. Это никогда не разочаровывало меня. Р>
Вы можете преобразовать PDF в Postscript (pstopdf или ps2pdf) и затем использовать обработку текста в файле Postscript. После этого вы можете преобразовать вывод обратно в PDF.
Это хорошо работает, если все PDF-файлы, которые вы хотите обработать, созданы одним и тем же приложением и несколько похожи. Если они поступают из разных источников, обычно трудно обрабатывать файлы Postscript - структура варьируется в значительной степени. Но даже после этого вы сможете исправить размеры страниц и тому подобное с помощью нескольких регулярных выражений.
В API Acrobat Javascript есть метод setPageBoxes, но Adobe не предоставляет никаких примеров кода Python. Только C ++, C # и VB.