我试图编写一个将pdf拆分成单独页面的函数。来自this SO answer。我复制了一个简单的函数,它将pdf分成不同的页面:
def splitPdf(file_):
pdf = PdfFileReader(file_)
pages = []
for i in range(pdf.getNumPages()):
output = PdfFileWriter()
output.addPage(pdf.getPage(i))
with open("document-page%s.pdf" % i, "wb") as outputStream:
output.write(outputStream)
return pages
但是,这会将新PDF写入文件,而不是将新PDF列表作为文件变量返回。所以我将output.write(outputStream)
的行更改为:
pages.append(outputStream)
当尝试在页面列表中编写元素时,我得到ValueError: I/O operation on closed file
。
有人知道如何将新文件添加到列表并返回它们,而不是将它们写入文件吗?欢迎所有提示!
答案 0 :(得分:5)
作为文件变量的PDF列表,您的意思并不完全清楚。如果要创建字符串而不是包含PDF内容的文件,并返回此类字符串的列表,请将open()
替换为StringIO
并调用getvalue()
以获取内容:
import cStringIO
def splitPdf(file_):
pdf = PdfFileReader(file_)
pages = []
for i in range(pdf.getNumPages()):
output = PdfFileWriter()
output.addPage(pdf.getPage(i))
io = cStringIO.StringIO()
output.write(io)
pages.append(io.getvalue())
return pages
答案 1 :(得分:3)
您可以在io
模块中使用内存中的二进制流。这会将pdf文件存储在您的内存中。
import io
def splitPdf(file_):
pdf = PdfFileReader(file_)
pages = []
for i in range(pdf.getNumPages()):
outputStream = io.BytesIO()
output = PdfFileWriter()
output.addPage(pdf.getPage(i))
output.write(outputStream)
# Move the stream position to the beginning,
# making it easier for other code to read
outputStream.seek(0)
pages.append(outputStream)
return pages
要稍后将对象写入文件,请使用shutil.copyfileobj
:
import shutil
with open('page0.pdf', 'wb') as out:
shutil.copyfileobj(pages[0], out)
答案 2 :(得分:1)
没有使用过PdfFileWriter,但认为这应该可行。
def splitPdf(file_):
pdf = PdfFileReader(file_)
pages = []
for i in range(pdf.getNumPages()):
output = PdfFileWriter()
output.addPage(pdf.getPage(i))
pages.append(output)
return pages
def writePdf(pages):
i = 1
for p in pages:
with open("document-page%s.pdf" % i, "wb") as outputStream:
p.write(outputStream)
i += 1