使用Python将PDF输出到STDOUT

1 投票
1 回答
1086 浏览
提问于 2025-04-18 10:53

我想用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 将这个字符串写入标准输出。

撰写回答