我需要从内容类型创建PDF(如果重要的话,使用dexerity制作),以便用户创建新文档,并在填写表单后生成PDF并准备下载。所以基本上在创建/修改文档之后,应该创建一个PDF并将其存储在ZODB中(实际上我正在使用blob),这样我就可以将视图链接到“以PDF格式下载”。
我见过PDFNode,但它似乎并不是我想要的。还有Produce & Publish,但它是一个web服务(?),我要开发的这个公司不希望(保密)在他们的数据中心之外发送数据。
有什么想法吗?
答案 0 :(得分:4)
您似乎在寻找这些:
答案 1 :(得分:3)
我实际上在我的一个项目上做了很多这样的事情。虽然我使用了Products.SmartPrintNG和fop,并没有采用该产品使用的标准方式(我认为它使用javascript来启动转换......很奇怪)。
夫妻俩:
无论如何,我创建PDF的事件处理程序最终看起来像这样:
from Products.SmartPrintNG.browser import SmartPrintView
from lxml.cssselect import CSSSelector
from lxml.html import fromstring, tostring
import re
san_re = re.compile('(?P<width>width\=("|\')\d{1,5}(px|%|in|cm|mm|em|ex|pt|pc)?("|\'))')
class Options(object):
def __init__(self, __dict):
self.__dict = __dict
def __getattr__(self, attr):
if self.__dict.has_key(attr):
return self.__dict[attr]
raise AttributeError(attr)
def sanitize_xml(xml):
selector = CSSSelector('table,td,tr')
elems = selector(xml)
for el in elems:
if el.attrib.has_key('width'):
width = el.attrib['width']
style = el.attrib.get('style', '').strip()
if style and not style.endswith(';'):
style += ';'
style += 'width:%s;' % width
del el.attrib['width']
el.attrib['style'] = style
return xml
def save_pdf(obj, event):
smartprint = SmartPrintView(obj, obj.REQUEST)
html = obj.restrictedTraverse('view')()
xml = fromstring(html)
selector = CSSSelector('div#content')
xml = selector(xml)
html = tostring(sanitize_xml(xml[0]))
res = smartprint.convert(
html=html,
format='pdf2',
options=Options({'stylesheet': 'pdf_output_stylesheet', 'template': 'StandardTemplate'})
)
field = obj.getField('generatedPDF')
field.set(obj, res, mimetype='application/pdf', _initializing_=True)
field.setFilename(obj, obj.getId() + '.pdf')
答案 2 :(得分:2)
Produce and Publish Lite是一个独立的开源代码,也是SmartPrintNG的继承者。 http://pypi.python.org/pypi/zopyx.smartprintng.lite/
答案 3 :(得分:0)
使用z3c.rml,非常适合从rml模板生成pdf,而不是从html转换,这可能很棘手。