Объедините два файла PDF в одну страницу с ротацией и переводом - PullRequest
1 голос
/ 10 апреля 2020

У меня есть два PDF-файла, которые мне нужно объединить в один, шириной 1 на 2 высоты. Если вы слышали о карточке для палатки, то она производит карточку для палатки в формате PDF.

У меня есть следующий скрипт, который выполняет различные части по отдельности, но не создает настоящий PDF с правильным вращением. Представьте себе фасет 5 "x5", производящий PDF 5 "x10", верхнюю половину вверх ногами:

-  -  -  -  -
|           |
|           |
|           |   < Upside-down "back"
|           |
|           |
-  -  -  -  -   < Imaginary line
|           |
|           |
|           |   < Right-side up "front
|           |
|           |
-  -  -  - -

Используя PyPDF2, кажется, что это будет легко, но хотя я смог чтобы заставить части работать (вращение, перевод, назад выше фронта, двойная высота на одну ширину), я не был в состоянии заставить их всех работать вместе.

Закомментированные строки - это другие вещи, которые я пробовал, которые, кажется, создают пустую верхнюю часть страницы, где должен быть «задний ход», при этом «передний край» правильно отображается / ориентируется нормально, только в нижняя часть x2 height translated_page outfile.

#!/usr/bin/python3

import PyPDF2

from PyPDF2.pdf import PageObject

front_reader = PyPDF2.PdfFileReader(open('front.pdf', 'rb'))
front = front_reader.getPage(0)

back_reader = PyPDF2.PdfFileReader(open('back.pdf', 'rb'))
back = back_reader.getPage(0)

tent_height = front.mediaBox.getHeight() + back.mediaBox.getHeight()

translated_page = PageObject.createBlankPage(None, back.mediaBox.getWidth(), tent_height)
# translated_page.mergeScaledTranslatedPage(back, 1, 0, front.mediaBox.getHeight())
# translated_page.mergeRotatedTranslatedPage(back, 180, 0, 0)
translated_page.mergeRotatedPage(back, 180)
translated_page.mergePage(front)

writer = PyPDF2.PdfFileWriter()
writer.addPage(translated_page)

with open('out.pdf', 'wb') as outfile:
    writer.write(outfile)

Вот файлы, на которые есть ссылки выше. Чего мне не хватает?

http://jf.dialogs.com/pdf-rotate-pypdf2.zip

1 Ответ

0 голосов
/ 10 апреля 2020

Решение включало матрицу преобразования, которую я применял; в основном я переводил его из 0, 0 origin, который поворачивал его вниз в нижний левый квадрант, при этом mediabox занимал верхнюю часть, исключительно справа:

-x,  y | x,  y
---------------
-x, -y | x, -y

Следующее решило эту проблему.

#!/usr/bin/python3

import PyPDF2

from PyPDF2.pdf import PageObject

front_reader = PyPDF2.PdfFileReader(open('front2.pdf', 'rb'))
front = front_reader.getPage(0)

back_reader = PyPDF2.PdfFileReader(open('back2.pdf', 'rb'))
back = back_reader.getPage(0)

tent_width = front.mediaBox.getWidth()
tent_height = front.mediaBox.getHeight() + back.mediaBox.getHeight()
tent_rotate_offset = front.mediaBox.getHeight()

translated_page = PageObject.createBlankPage(None, tent_width, tent_height)
translated_page.mergeRotatedTranslatedPage(back, 180, tent_width / 2, tent_rotate_offset)
translated_page.mergePage(front)

writer = PyPDF2.PdfFileWriter()
writer.addPage(translated_page)

with open('out.pdf', 'wb') as outfile:
    writer.write(outfile)

Я не уверен, почему это половина ширины. Это поместило бы x-origin перед преобразованием в 4,25 дюйма, что предполагает, что само вращение центрировано по размерам front ширины страницы, а не углу вместо a / corner.

...