使用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'}]
答案 0 :(得分:2)
reportlab画布一次只能在一个页面上运行,因此您需要在每个输出页面使用reportlab doForm()
和showPage()
函数,而不是在列表的所有页面上使用。
已编辑添加
我记得我有一些示例代码,它会使用reportlab here将PDF文件的一部分页面复制到输出文件中。内循环执行此操作:
for page in pages:
canvas.setPageSize((page.BBox[2], page.BBox[3]))
canvas.doForm(makerl(canvas, page))
canvas.showPage()
对于它的价值,如果你只是复制页面,你不需要reportlab;在上面的目录中有一个类似的子集示例,仅使用pdfrw。
(免责声明:我是主要的pdfrw作者。)
答案 1 :(得分:1)
我希望,这个答案将有助于使用 Canvas 在同一个 pdf 文件上生成多个页面。 基于 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()