【问题标题】:ReportLab Add Multi-page PDF to CanvasReportLab 将多页 PDF 添加到 Canvas
【发布时间】:2017-05-03 04:00:41
【问题描述】:

将 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'}]

【问题讨论】:

    标签: reportlab pdf-reader pdfrw


    【解决方案1】:

    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 的主要作者。)

    【讨论】:

    【解决方案2】:

    我希望,这个答案将有助于使用 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()
    

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2020-12-05
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多