2017-06-02 2 views
0
with open(pdf,'rb') as fin: 
    reader = PyPDF2.PdfFileReader(fin) 
    new_pdf = PyPDF2.PdfFileWriter() 

    for i in range(reader.numPages): 
     new_pdf.addPage(reader.getPage(i)) 

    out_file = pdf if not create_copy else self._new_copy(pdf) 
    with open(out_file,'wb') as fout: 
     new_pdf.write(fout) 

Ceci fonctionne comme prévu lors de l'écriture d'une copie.Pourquoi avoir besoin d'instructions imbriquées pour le lecteur et l'auteur?

Maintenant, nous allons passer les trois dernières lignes de la with:

with open(pdf,'rb') as fin: 
    reader = PyPDF2.PdfFileReader(fin) 
    new_pdf = PyPDF2.PdfFileWriter() 

    for i in range(reader.numPages): 
     new_pdf.addPage(reader.getPage(i)) 

out_file = pdf if not create_copy else self._new_copy(pdf) 
with open(out_file,'wb') as fout: 
    new_pdf.write(fout) 

Cela crée un pdf avec la bonne quantité de pages, mais toutes les pages sont vides, même lors de l'écriture à un nouveau fichier. (Notez que déplacer le new_pdf = ..., aussi, ne change rien)

Pourquoi? Et que puis-je faire à ce sujet? Parce que je m'attends à devoir déplacer ces trois lignes sur le premier with, éventuellement, afin de fournir un support d'écrasement. (À moins que je ne crée une copie de toute façon puis renommez, ce que je veux éviter.)

+0

Est-ce que cela fonctionne vraiment dans le premier cas d'avoir le même fichier ouvert à la fois pour lire et pour écrire "sinon create_copy"? –

+0

@AndreasDeak bien sûr que non. – User1291

+0

Je ne peux que deviner ici, mais peut-être 'addPage' ne copie pas vraiment la page dans' new_pdf' mais seulement une référence au fichier original, et ce fichier est fermé à la fin de 'with'. –

Répondre

3

C'est une sorte de conjecture, car je ne suis pas familier avec le module et je n'ai pas pris la peine de read the source code.

Cependant, d'après la documentation, il semble que PdfFileWriter.addPage attend un , qui fait référence au fichier PDF auquel appartient la page. Donc, je suppose que addPage ne crée pas immédiatement une copie de, mais juste une référence à la page dans le PDF original, et lorsque ce fichier est fermé avant que le nouveau PDF a été écrit, le contenu de cette page est perdu.