2 votes

texte imprimé deux fois sur la même page

J'ai un problème avec mon pdf généré, le fichier pdf généré a 4 pages et j'utilise un pdf existant avec deux pages. Je dois écrire du texte en utilisant pyPD2 y reportlab .

Quand j'utilise getPage() J'ai pensé à faire une copie de la page avant de fusionner, mais pour certaines raisons, il utilise la même page et mon texte a été imprimé plusieurs fois.

Comment puis-je éviter cela ?

Mon code :

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

1voto

B8vrede Points 1347

Le problème est que getPage() renvoie en fait le pointeur vers la page au lieu d'une page complètement nouvelle. Ainsi, lorsque mergePage() est appliqué il le fusionne dans le pdf existant.

La solution la plus simple est de créer d'abord une page vierge et de l'utiliser pour fusionner les autres pages, ce qui donnera le résultat suivant :

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)

Une remarque : au lieu de créer une page vierge complètement séparée en utilisant la fonction createBlankPage vous pouvez également utiliser output.addBlankPage mais cela nécessite de définir manuellement la taille de la page, ce qui n'est pas forcément idéal. C'est pourquoi la pdf mot clé de createBlankPage est utilisé, cela définit la taille de la page à la dernière page du pdf fourni.

0voto

WaKo Points 7674

Comme @B8vrede l'a dit plus haut addBlankPage peut être utilisé, donc au lieu de créer une page blanche séparée, j'ai appelé addBlankPage (qui renvoie une référence à la nouvelle page créée) en spécifiant l'option A4 taille.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X