使用Python将PDF输出到STDOUT
我想用Python把两个PDF文件合并在一起(在一个已有的文档前加一个预先制作的封面),然后把结果展示给浏览器。我现在使用的是PyPDF2这个库,它可以很简单地完成合并,但PdfFileWriter类的write()方法似乎只支持写入文件对象(必须支持write()和tell()方法)。在这种情况下,我并不想接触文件系统;合并后的PDF已经在内存中,我只想发送一个内容类型的头部,然后把文档发送到标准输出(通过CGI给浏览器)。有没有比PyPDF2更适合将文档写入标准输出的Python库?或者,有没有办法把标准输入输出作为参数传递给PdfFileWriter的write()方法,让它看起来像是在写入一个文件句柄?
让write()把文档写入文件系统,然后再打开这个生成的文件并发送给浏览器是可行的,但在这种情况下并不是一个好选择(而且这样做也太不优雅了)。
解决方案
根据mgilson的建议,我在Python 2.7中是这样让它工作的:
#!/usr/bin/python
import cStringIO
import sys
from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()
###
# Actual PDF open/merge code goes here
###
output = cStringIO.StringIO()
merger.write(output)
print("Content-type: application/pdf\n")
sys.stdout.write(output.getvalue())
output.close()
1 个回答
1
Python支持一种“内存中的”文件类型,这个功能可以通过 cStringIO.StringIO
(或者根据你使用的Python版本,可能是 io.BytesIO
)来实现。在你的情况下,你可以创建这两个类中的一个的实例,然后把这个实例传给需要文件的那个方法。接着,你可以使用 .getvalue()
方法来获取内容,这个内容会以字符串(或者字节,取决于你的Python版本)形式返回。一旦你得到了字符串内容,你可以直接用 print
来打印它,或者使用 sys.stdout.write
将这个字符串写入标准输出。