2010-04-30 22 views
3

Je ne suis pas sûr de la meilleure façon de le dire, mais ce que je veux faire, c'est lire un fichier pdf, apporter diverses modifications, et enregistrer le pdf modifié sur le fichier original. A partir de maintenant, je suis en mesure d'enregistrer le pdf modifié dans un fichier séparé, mais je cherche à remplacer l'original, pas créer un nouveau fichier.Comment écraser un fichier en cours de lecture par Python

Voici mon code actuel:

from pyPdf import PdfFileWriter, PdfFileReader 

output = PdfFileWriter() 
input = PdfFileReader(file('input.pdf', 'rb')) 
blank = PdfFileReader(file('C:\\BLANK.pdf', 'rb')) 

# Copy the input pdf to the output. 
for page in range(int(input.getNumPages())): 
    output.addPage(input.getPage(page)) 

# Add a blank page if needed. 
if (input.getNumPages() % 2 != 0): 
    output.addPage(blank.getPage(0)) 

# Write the output to pdf. 
outputStream = file('input.pdf', 'wb') 
output.write(outputStream) 
outputStream.close() 

Si je change le outputStream à un nom de fichier différent, il fonctionne très bien, je ne peux pas simplement écraser le fichier d'entrée, car il est encore utilisé. J'ai essayé de .close() le flux, mais il me donnait aussi des erreurs. J'ai le sentiment que cela a une solution assez simple, je n'ai tout simplement pas eu de chance de le trouver.

Merci!

Répondre

2

Vous avez dit que vous avez essayé de fermer() le flux, mais obtenez des erreurs? Vous pouvez supprimer les objets PdfFileReader pour vous assurer que personne n'a encore accès au flux. Et puis fermez le flux.

from pyPdf import PdfFileWriter, PdfFileReader 

inputStream = file('input.pdf', 'rb') 
blankStream = file('C:\\BLANK.pdf', 'rb') 
output = PdfFileWriter() 
input = PdfFileReader(inputStream) 
blank = PdfFileReader(blankStream) 

... 

del input # PdfFileReader won't mess with the stream anymore 
inputStream.close() 
del blank 
blankStream.close() 

# Write the output to pdf. 
outputStream = file('input.pdf', 'wb') 
output.write(outputStream) 
outputStream.close() 
7

Vous pouvez toujours renommer le fichier de sortie temporaire à l'ancien fichier:

import os 
f = open('input.pdf', 'rb') 
# do stuff to temp.pdf 
f.close() 
os.rename('temp.pdf', 'input.pdf') 
1

Si les fichiers PDF sont assez petits (qui va dépendre de votre plate-forme), vous pouvez simplement lire le tout, fermez le fichier, modifier les données, puis écrire de nouveau la chose sur le même fichier .