2017-05-03 138 views
0

使用PdfReader和ReportLab,我試圖拉入一個PDF頁面,保存它(都成功),然後拉入一個多頁PDF並執行相同的操作。 我知道如何一次拉出一頁PDF,但我一直在努力拉動一頁以上。ReportLab將多頁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'}] 

回答

1

的ReportLab的帆布只能在一個頁面上的時間,所以你需要使用ReportLab的doForm()和​​功能每個輸出頁面一次,而不是對所有頁面的列表。

編輯補充

我只記得,我有一些示例代碼,將一個PDF文件的網頁的子集複製到使用ReportLab的here的輸出文件。內部循環是這樣的:

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

對於什麼是值得的,如果你只是複製頁面,你不需要reportlab;在上面的目錄中有一個與pdfrw完全相同的子集示例。

(聲明:我是主pdfrw作者。)

+0

感謝,@Patrick莫平!我有另一個問題,我將作爲一個單獨的問題發佈。 –

+0

新問題在這裏:http://stackoverflow.com/questions/43773477/reportlab-and-pdfrw-importing-scanned-pdf –