Обрезка страниц .pdf файла

Мне было интересно, есть ли у кого-нибудь опыт работы с программными файлами .pdf. У меня есть .pdf файл, и мне нужно обрезать каждую страницу до определенного размера.

После быстрого поиска Google я нашел библиотеку pyPdf для python, но мои эксперименты с ней не удались. Когда я изменил атрибуты cropBox и trimBox на объекте страницы, результаты не были тем, что я ожидал, и выглядели довольно случайными.

У кого-нибудь есть опыт? Примеры кода были бы хорошо оценены, предпочтительно в python.

Ответ 1

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 точки внутри медиа-блока. Коробка обрезки - это 25 точек внутри коробки обрезки.

Вот как выглядит мой пример документа в acrobat professional после обработки с помощью приведенного выше кода: crop pages screenshot

Этот документ будет пустым при загрузке в Acrobat Reader.

Ответ 2

Используйте это, чтобы получить размер 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)

Ответ 3

Вероятно, вы ищете бесплатное решение, но если у вас есть деньги, PDFlib - сказочная библиотека. Меня это никогда не разочаровывало.

Ответ 4

Вы можете преобразовать PDF в Postscript (pstopdf или ps2pdf) и использовать текстовую обработку в файле Postscript. После этого вы можете преобразовать вывод обратно в PDF.

Это хорошо работает, если PDF файлы, которые вы хотите обработать, генерируются одним и тем же приложением и несколько похожи. Если они поступают из разных источников, обычно бывает сложно обрабатывать файлы Postscript - структура варьируется в значительной степени. Но даже если вы можете установить размер страницы и т.д. С помощью нескольких регулярных выражений.

Ответ 5

API-интерфейс Acrobat Javascript имеет метод setPageBoxes, но Adobe не предоставляет образцы кода Python. Только С++, С# и VB.

Ответ 6

как преобразовать эту обрезанную часть в JPEG