ReportLab и pdfrw: импорт отсканированных PDF-файлов

Используя приведенный ниже код, я пытаюсь импортировать страницу 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()
c.save()

Заранее спасибо!


person Dance Party    schedule 04.05.2017    source источник
comment
Два вопроса: 1) вы используете 0.3 или установили последнюю версию с github; и 2) можете ли вы прислать мне PDF-файл, который не работает?   -  person Patrick Maupin    schedule 04.05.2017
comment
Я использую 3.4.0. Могу ли я отправить PDF напрямую? Не уверен, как через S.O.   -  person Dance Party    schedule 04.05.2017
comment
Я имел в виду версию pdfrw, а не версию Python. Что касается отправки образца, мой адрес электронной почты доступен на github...   -  person Patrick Maupin    schedule 04.05.2017
comment
О, извините, это была версия ReportLab. Я использую pdfrw 0.3. В ближайшее время вышлю pdf.   -  person Dance Party    schedule 04.05.2017


Ответы (1)


Тааак...

С одной стороны, я совершенно не понимаю, почему это происходит, и не так много времени, чтобы отлаживать это прямо сейчас.

С другой стороны, у меня есть для вас обходной путь (и я пробовал обходной путь на v0.3, а также на текущем мастере github, и он работал у меня в обоих случаях).

Я начал с проверки того, что ваш код не работает на вашей странице и что он работает в другом PDF-файле. Затем я спросил себя: «Что произойдет, если я использую свой пример водяного знака для создания PDF-файла с вашей страницей в качестве водяного знака?» (потому что в нем используется один и тот же код формы XObject). Это сработало, поэтому я спросил себя: «Как это будет выглядеть, если я передам свою страницу с водяными знаками через ваш код reportlab?»

Интересно, что вся страница с водяными знаками, включая ваше изображение, прошла. Поэтому я изменил ваш код, чтобы он выполнял минимальные действия, которые выполняет водяной знак, в результате чего форма XObject помещается внутрь формы XObject, когда он передается в reportlab. Это сработало.

Вот слегка измененная версия вашего кода, которую я использовал для этого.

import sys

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

inch = 72

fname, = sys.argv[1:]
page = PdfReader(fname,decompress=False).pages[0]
p = pagexobj(PageMerge().add(page).render())

c = canvas.Canvas('outstuff.pdf')
c.setPageSize([8.5*inch, 11.0*inch]) #Set page size (for portrait)
c.doForm(makerl(c, p))
c.showPage()
c.save()
person Patrick Maupin    schedule 05.05.2017
comment
Вы спасли мой день, это беспокоило меня уже очень давно! - person mortbauer; 01.02.2019