我pdftk
用于处理 PDF 文件。
new_doc.save()
url = "/docs/" +settings.MEDIA_URL + new_doc.pdf_file.name
command = 'pdftk '+url+" dump_data_fields"
问题是我必须使用new_doc.save
before pdftk
。
有没有办法pdftk
在不保存的情况下处理文件?
使用subprocess.Popen()
withsubprocess.PIPE
作为stdin
andstdout
参数。因为pdftk
可以从stdin
您那里获取输入,然后可以直接将文件“写入”pdftk
而不是文件系统:
import subprocess
command = ['pdftk', '-', 'dump_data_fields']
p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output, errorout = p.communicate(input=new_doc_data)
该Popen.communicate()
方法返回stdout
和stderr
结果。
请注意,input
参数 to.communicate()
必须是字符串。如果new_doc
是某种文件对象,则必须传入new_doc.read()
或类似的结果;在上面的示例中,我使用变量名称new_doc_data
来指示您将数据new_doc
作为字符串传递,因为我不知道您可以在这些对象上使用什么 API。
最好的选择是使用 StringIO
我假设在某些时候 new_doc 来自模板并且它是某种文本。在这种情况下,你可以做这样的事情。
from StringIO import StringIO
new_doc = 'foobar'
doc = StringIO(new_doc)
doc.seek(0)
doc.read()
输出将是“foobar”
第一行 import StringIO(对于更快的版本,请执行 From cStringIO import StringIO)。然后我们创建一个字符串并用它实例化一个 StringIO 对象。从那里它几乎就像一个