PythonРежем PDF

Понадобилась тут на днях срочно одна книжка. Купить не представлялось возможным, а читать с экрана — зло.
Поэтому хотелось бы ее распечатать. Только вот незадача, все страницы в книге были размещены по 2 на листе.

В таком виде книжку печатать было бы нереально.
Поэтому я отправился в гугл на поиски решений.
Нашел кучу всего но только не того что нужно было мне, поэтому решил разобраться своими силами.

Для этого я нашел библиотеку pyPdf

apt-get install python-pypdf


from pyPdf import PdfFileWriter, PdfFileReader 
import sys


К сожалению у библиотеки нету документации, а той документации что я нашел на официальном сайте явно не достаточно.
Поэтому с помощью функции dir() я нашел нужные мне атрибуты и методы.

Имя файла передается как параметр. Загружаем PDF и открываем файл для записи:
filename = sys.argv[1]
output = PdfFileWriter()
input1 = PdfFileReader(file(filename,"rb"))
input2 = PdfFileReader(file(filename,"rb"))


Файл открывается 2 раза т.к. нам необходимо объединять левую и правую половину страницы, а как я понял входной файл передается по ссылке.

Дальше идет цикл по страницам PDF и для каждой мы помещаем в выходной файл сначала левую половину, затем правую:
for i in range(input1.getNumPages()):
	page_right = input1.getPage(i) 
	
	page_right.mediaBox.upperRight = (
		page_right.mediaBox.getUpperRight_x(),
		page_right.mediaBox.getUpperRight_y() / 2 + 30,
	)
	page_right.mediaBox.lowerLeft = (0,30)
	
	output.addPage(page_right)

	page_left = input2.getPage(i) 

	page_left.mediaBox.lowerLeft = ( 	
		0,
		page_left.mediaBox.getUpperRight_y() / 2 - 30
	)
	page_left.mediaBox.upperRight = ( 	
		page_left.mediaBox.getUpperRight_x(),
		page_left.mediaBox.getUpperRight_y() - 30
	)


	output.addPage(page_left)


Ну в завершении ничего сложного: Создаем файл, записываем в него конвертированные страницы и закрываем его.
outputStream = file("output.pdf","wb")
output.write(outputStream)
outputStream.close()



В итоге, аккуратно нарезанные странички, напечатанная книжка и счастливый читатель.
Скрипт можно скачать здесь: pdf2halfpagepdf.py
  • +10
  • v1ctor
  • 26 февраля 2011, 23:06

Комментарии (6)

По коду ты разделяешь их по вертикали, это как-то диссонирует со скрином. И добавляешь в выхлоп сначала правую половину (т.е. нижнюю часть?), затем левую (т.е.е верхнюю?). Разъясни в чём я ошибаюсь.
Это ведь растр? Оно его всё равно режет? Или там нет «физического» разрезания, а некая мета меняется?

..bw
атрибуты upperRight, upperLeft, lowerRight, lowerLeft Соответствуют соответственно верхнему правому, верхнему левому, нижнему правому, нижнему левому углам. Причем как оказалось действительно то что видим диссонирует с тем что пишем. Т.К. координаты X и Y поменяны местами в отличии от привычного представления осей координат. В выходной файл кидаю левую затем правую часть страницы.
С таким только под веществами работать :-).
А что по второму вопросу?
Хм… На счет растра сомневаюсь. Спокойной можно извлечь текст из pdf файла. Разделение вроде мета информацией. Файл стал в 2 раза больше (видимо из-за использования первого 2 раза). Как в одном файле 2 раза указать мету для правого и левого листа я не нашел.
Создает впечатление очередного костыля. Кстати, а не посоветуете полнофункциональной библиотеки для PDF?

Скупой платит дважды (с)

P.S. Хотя в вашем случае Вы в начале сэкономили, а только потом уже заплатили местом на диске.
Ну костыль был необходим. Не знаю заплатил ли я дважды, но подарок вышел, что надо.=)

К сожалению мои поиски больше ни к чему не привели.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.