2024-04-29 02:35:12 发布
网友
我正在使用pdftk处理PDF文件。在
pdftk
new_doc.save() url = "/docs/" +settings.MEDIA_URL + new_doc.pdf_file.name command = 'pdftk '+url+" dump_data_fields"
问题是我必须在pdftk之前使用new_doc.save。在
new_doc.save
有没有办法让pdftk处理文件而不保存它?在
你最好的选择是和StringIO
我假设在某一点上,new_doc来自一个模板,它是某种类型的文本。在这种情况下,你可以这样做。在
from StringIO import StringIO new_doc = 'foobar' doc = StringIO(new_doc) doc.seek(0) doc.read()
输出将为“foobar”
第一行import StringIO(对于更快的版本do From cStringIO import StringIO)。然后我们创建一个字符串并用它实例化一个StringIO对象。从那里看起来就像是
使用^{}和^{}作为stdin和{}参数。因为pdftk可以接受来自stdin的输入,因此可以直接将文件“写入”到pdftk而不是文件系统:
stdin
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)
^{} method返回stdout和stderr结果。在
stdout
stderr
注意,.communicate()的input参数必须是字符串。如果new_doc是某种文件对象,则必须传入new_doc.read()或类似的结果;在上面的示例中,我使用变量名new_doc_data来指示您将来自new_doc的数据作为字符串传入,因为我不知道可以在这些对象上使用什么API。在
.communicate()
input
new_doc
new_doc.read()
new_doc_data
你最好的选择是和StringIO
我假设在某一点上,new_doc来自一个模板,它是某种类型的文本。在这种情况下,你可以这样做。在
输出将为“foobar”
第一行import StringIO(对于更快的版本do From cStringIO import StringIO)。然后我们创建一个字符串并用它实例化一个StringIO对象。从那里看起来就像是
使用^{} 和^{} 作为}参数。因为
stdin
和{pdftk
可以接受来自stdin
的输入,因此可以直接将文件“写入”到pdftk
而不是文件系统:^{} method 返回
stdout
和stderr
结果。在注意,
.communicate()
的input
参数必须是字符串。如果new_doc
是某种文件对象,则必须传入new_doc.read()
或类似的结果;在上面的示例中,我使用变量名new_doc_data
来指示您将来自new_doc
的数据作为字符串传入,因为我不知道可以在这些对象上使用什么API。在相关问题 更多 >
编程相关推荐