2017-01-01 31 views
2

我對生成的PDF有一個問題,生成的pdf文件有4頁,我使用的是現有的兩頁PDF。我必須使用pyPD2reportlab來編寫一些文本。文本在同一頁上打印兩次

當我使用getPage()方法時,我想在合併之前製作頁面副本,但由於某些原因它使用相同的頁面,並且我多次打印了我的文本。

我該如何避免這種情況?

我的代碼

packet = io.BytesIO() 
can = canvas.Canvas(packet) 
can.drawString(0,0, "Print on page 1") 
can.showPage() 
can.drawString(200,200, "Print on page 2") 
can.showPage() 
can.drawString(0,0, "Print on page 3") 
can.showPage() 
can.drawString(200,200, "Print on page 4") 
can.save() 

new_pdf = PdfFileReader(packet) 

path_of_two_page_pdf = 'overview.pdf' 
existing_pdf = PdfFileReader(file(path_of_two_page_pdf, "rb")) 

output = PdfFileWriter() 
for pi in range(4): 
    page = existing_pdf.getPage(pi % 2) 
    page.mergePage(new_pdf.getPage(pi)) 
    output.addPage(page) 

outputStream = file("NEW_PDF.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 
+0

你能鏈接到輸入文件,所以我可以進一步瞭解嗎? –

+0

@ B8vrede我不明白爲什麼這個downvote。任何有兩頁的PDF都會很好(我在每頁上繪製不同的字符串)。 – Zety

+0

但正如我剛剛修復那部分我刪除downvote – B8vrede

回答

1

的問題是,getPage()指針實際上返回的頁面,而不是一個完全新的一頁。所以當mergePage()被應用時,它將它合併到現有的pdf中。

最簡單的解決方法是先創建一個空白頁面,並用它來合併其他頁面上,這將是這樣的:

for pi in range(2*2): 
    # By doing this we will always create a blank page with the same size as the last page of the existing_pdf 
    new_page = PageObject.createBlankPage(pdf=existing_pdf) 

    # Merge the pages onto the blank page 
    new_page.mergePage(existing_pdf.getPage(pi % 2)) 
    new_page.mergePage(new_pdf.getPage(pi)) 

    # Add the new page to the output 
    output.addPage(new_page) 

一個音符,而不是創建使用createBlankPage一個完全獨立的空白頁您也可以使用output.addBlankPage,但這需要手動設置頁面大小,這可能並不理想。因此,使用pdf關鍵字createBlankPage,這將頁面大小設置爲所提供pdf的最後一頁。

0

作爲@ B8vrede mensioned以上addBlankPage可以被使用,所以不是創建單獨的空白頁我稱爲addBlankPage(它返回到新創建的頁面的引用)指定A4大小。

from reportlab.lib.pagesizes import A4 


for pi in range(4): 
    new_page = output.addBlankPage(*A4) 
    new_page.mergePage(existing_pdf.getPage(pi % 2)) 
    new_page.mergePage(new_pdf.getPage(pi))