2010-04-30 59 views
3

我不太确定最好的方式来说这个,但我想要做的是阅读一个PDF文件,进行各种修改,并保存修改过的PDF原始文件。截至目前,我能够将修改过的pdf保存到一个单独的文件中,但我期待替换原始文件,而不是创建新文件。如何覆盖当前正在被Python读取的文件

这里是我当前的代码:

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

如果我改变outputStream到不同的文件名,它工作得很好,我只是不能保存在输入文件,因为仍在使用它。我尝试过.close()这个流,但它也给我错误。

我有一种感觉,这有一个相当简单的解决方案,我只是没有找到它的运气。

谢谢!

回答

2

你说你试图关闭()流,但得到的错误?您可以删除PdfFileReader对象以确保没有人能够访问该流。然后关闭流。

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

您可以随时重命名临时输出文件的旧文件:

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

如果PDF文件足够小(那将取决于你的平台上),你可以只读取整个事情中,关闭该文件,修改数据,然后写了整个事情又回到了同一个文件。