2014-06-24 24 views
1

我想將兩個PDF文檔與Python合併(在現有文檔中預先製作一個封面)並將結果呈現給瀏覽器。我目前使用PyPDF2庫,它可以很容易地執行合併,但PdfFileWriter類write()方法似乎只支持寫入文件對象(must support write() and tell() methods)。在這種情況下,沒有理由觸摸文件系統;合併的PDF已經在內存中,我只想發送Content-type頭文件,然後將文檔發送到STDOUT(通過CGI瀏覽器)。有沒有比PyPDF2更適合將文檔寫入STDOUT的Python庫?或者,是否有辦法將STDIO作爲參數傳遞給PdfFileWriter的write()方法,使其看起來像write()一樣是一個文件句柄? ()將文檔寫入文件系統,然後打開生成的文件並將其發送到瀏覽器,但在這種情況下(這不是一種非常不雅觀的選擇),這不是一個選項。使用Python將PDF寫入STDOUT

解決方案

使用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

我猜你試過傳遞'sys.stdout'?這可能不支持'.tell' ...如果是這種情況,你可以寫一個'cStringIO.StringIO'(或'io.BytesIO')實例,然後將_that_的內容寫入stdout ... – mgilson

+0

This完美地工作。我使用PdfFileMerger寫入一個cStringIO對象,然後在該對象上調用一個sys.stdout.write().getvalue()。謝謝! – Riblet

+0

我想我會作爲答案張貼,所以我們可以關閉這一個... – mgilson

回答

1

Python支持通過cStringIO.StringIO(或io.BytesIO的 「內存」 文件類型。 ..取決於python版本)。在你的情況下,你可以創建其中一個類的實例,將它傳遞給期望文件的方法,然後你可以使用方法返回字符串的內容(或者取決於python版本的字節)。將內容作爲字符串使用後,可以簡單地使用print或使用sys.stdout.write將字符串寫入標準輸出。