2017-01-01 6 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에 병합됩니다. 대신 createBlankPage를 사용하여 완전히 분리 된 빈 페이지를 만드는,

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) 

한 참고 :

가장 쉬운 해결 방법은 먼저 빈 페이지를 만들고 다음과 같이 것,에 다른 페이지를 병합하는 것을 사용하는 것입니다 output.addBlankPage을 사용할 수도 있지만 수동으로 페이지 크기를 설정해야 이상적 일 수 있습니다. 따라서 createBlankPage이라는 pdf 키워드가 사용되면,이 옵션은 페이지 크기를 제공된 pdf의 마지막 페이지로 설정합니다. addBlankPage 위 @ B8vrede mensioned으로

0

사용, 그래서 대신 A4 크기를 지정 (새로 생성 된 페이지에 대한 참조를 반환) 내가 addBlankPage라는 별도의 빈 페이지를 만들 수 있습니다.

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))