我正在使用pdftk
处理PDF文件。
new_doc.save()
url = "/docs/" +settings.MEDIA_URL + new_doc.pdf_file.name
command = 'pdftk '+url+" dump_data_fields"
问题是我必须在new_doc.save
之前使用pdftk
。
有没有办法让pdftk
在不保存的情况下处理文件?
答案 0 :(得分:1)
将subprocess.Popen()
与subprocess.PIPE
一起用作stdin
和stdout
参数。由于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()
method会同时返回stdout
和stderr
个结果。
请注意,input
的{{1}}参数必须是字符串。如果.communicate()
是某种文件对象,则必须传入new_doc
或类似的结果;在上面的示例中,我使用变量名new_doc.read()
来表示您将new_doc_data
中的数据作为字符串传递,因为我不知道您可以在这些对象上使用哪种API。
答案 1 :(得分:-1)
您最好的选择是使用StringIO
我假设在某些时候new_doc来自模板,它是某种文本。在这种情况下,你可以做这样的事情。
from StringIO import StringIO
new_doc = 'foobar'
doc = StringIO(new_doc)
doc.seek(0)
doc.read()
输出将是'foobar'
第一行导入StringIO(对于更快的版本,请执行从cStringIO导入StringIO)。然后我们创建一个字符串并用它实例化一个StringIO对象。从那里它非常像一个