如何";“写入变量”;而不是",;提交;用Python
我正在尝试编写一个函数,将pdf拆分为单独的页面。从…起我复制了一个简单的函数,可以将pdf拆分为单独的页面:如何";“写入变量”;而不是",;提交;用Python,python,pdf,io,outputstream,pypdf,Python,Pdf,Io,Outputstream,Pypdf,我正在尝试编写一个函数,将pdf拆分为单独的页面。从…起我复制了一个简单的函数,可以将pdf拆分为单独的页面: def splitPdf(file_): pdf = PdfFileReader(file_) pages = [] for i in range(pdf.getNumPages()): output = PdfFileWriter() output.addPage(pdf.getPage(i)) with ope
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操作,操作的是关闭的文件
有人知道我如何将新文件添加到列表并返回它们,而不是将它们写入文件吗?欢迎所有提示 您可以在模块中使用内存中的二进制流。这将在您的内存中存储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)
还没有使用PdfielWriter,但认为这应该有效
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
“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
您是否尝试过读取数据,而不是存储文件句柄-
pages.append(outputStream.read())
?您是否尝试过使用cStringIO.StringIO
打开outputStream
?上述用户所说的……您通常可以用StringIO
对象替换文件,并将结果作为way@jonrsharpe-我刚试过,这给了我一个IOError:文件未打开,无法读取ingpages.append(outputStream.read())
。还有其他想法吗?@user4815162342-Ehm,没有,我还没有尝试过StringIO。关于如何实现这一点,有什么建议吗?非常欢迎使用代码示例……:(这个答案仅适用于Python 2)@Garrett不过,适应Python 3应该很简单。