ReportLab Добавить многостраничный PDF в Canvas

Используя PdfReader вместе с ReportLab, я пытаюсь вставить страницу PDF, сохранить ее (обе успешно), затем вставить многостраничный PDF и сделать то же самое. Я знаю, как вытащить в PDF одну страницу за раз, но я изо всех сил пытаюсь вытащить более одной страницы.

from reportlab.pdfgen import canvas
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl

c = canvas.Canvas(Out_Folder+pdf_file_name)
c.setPageSize([11*inch, 8.5*inch])

page = PdfReader(folder+'2_VisionMissionValues.pdf',decompress=False).pages
p = pagexobj(page[0])
c.setPageSize([11*inch, 8.5*inch]) #Set page size (for landscape)
c.doForm(makerl(c, p))
c.showPage()

p3_ = PdfReader(m4folder+'Academy.pdf',decompress=False).pages

Вот где я потерялся. Я знаю, что это работает, просто потянув на первой странице....

p3 = pagexobj(p3_[0])

Но если я хочу добавить все страницы PDF, я не уверен, что делать. Я попробовал это:

p3 = [pagexobj(x) for x in p3_[:]]

но это привело к ошибке подтверждения (см. ниже).

c.setPageSize([8.5*inch, 11*inch]) #Set page size (for portrait)
c.doForm(makerl(c, p3))
c.showPage()
c.save()


AssertionError: [{'/BBox': [0.0, 0.0, 792.0, 612.0], '/Filter': '/FlateDecode', '/FormType': 1, '/Matrix': [0, 1, -1, 0, 0, 0], '/Length': '56', '/Subtype': '/Form', '/Resources': {'/ProcSet': ['/PDF', '/ImageB', '/ImageC', '/ImageI'], '/XObject': {'/Im1': (8, 0)}}, '/Type': '/XObject'}, {'/BBox': [0.0, 0.0, 792.0, 612.0], '/Filter': '/FlateDecode', '/FormType': 1, '/Matrix': [0, 1, -1, 0, 0, 0], '/Length': '56', '/Subtype': '/Form', '/Resources': {'/ProcSet': ['/PDF', '/ImageB', '/ImageC', '/ImageI'], '/XObject': {'/Im2': (17, 0)}}, '/Type': '/XObject'}]

2 ответа

Решение

Холст reportlab работает только на одной странице за раз, поэтому вам нужно использовать reportlab doForm() а также showPage() функционирует один раз для каждой выходной страницы, а не на всех страницах в виде списка.

Отредактировано, чтобы добавить

Я только что вспомнил, что у меня есть некоторый пример кода, который будет копировать подмножество страниц PDF-файла в выходной файл с использованием reportlab здесь. Внутренний цикл делает это:

for page in pages:
    canvas.setPageSize((page.BBox[2], page.BBox[3]))
    canvas.doForm(makerl(canvas, page))
    canvas.showPage()

Для чего это стоит, если вы только копируете страницы, вам не нужен reportlab; в приведенном выше каталоге есть аналогичный пример подмножества, который делает это исключительно с pdfrw.

(Отказ от ответственности: я основной автор pdfrw.)

Надеюсь, этот ответ поможет создать несколько страниц в одном PDF-файле с помощью Canvas. На основе ReportLab UserGuide :

Метод showPage заставляет холст перестать рисовать на текущей странице, и любые дальнейшие операции будут рисоваться на следующей странице (если есть какие-либо дальнейшие операции - в противном случае новая страница не создается). Метод save должен быть вызван после завершения построения документа - он генерирует PDF-документ, что и является целью объекта холста.

Вот простой пример.

      from reportlab.pdfgen.canvas import Canvas

def write(myfile, page_number):
    myfile.drawString(200, 600, 'Page number %i script' % page_number)

myfile = Canvas('multi_pages.pdf')
total_pages = 3

for i in range(total_pages):
    write(myfile, i)
    myfile.showPage()

myfile.save()
Другие вопросы по тегам