如何在Python中“写入变量”而不是“to file”

时间:2014-10-23 13:31:05

标签: python pdf io outputstream pypdf

我试图编写一个将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

有人知道如何将新文件添加到列表并返回它们,而不是将它们写入文件吗?欢迎所有提示!

3 个答案:

答案 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