3

我需要从内容类型创建 PDF(如果这很重要,请使用敏捷制作),以便用户创建一个新文档,并在填写表单后生成一个 PDF 并准备下载。所以基本上在创建/修改文档之后,应该创建一个 PDF 并将其存储在 ZODB 中(实际上我正在使用 blob),以便我可以将视图与“下载为 PDF”链接。

我见过PDFNode但它似乎不是我要找的。还有Produce & Publish,但它是一个网络服务(?),我要为其开发此服务的公司不希望(出于隐私考虑)将数据发送到他们的数据中心之外。

任何的想法?

4

4 回答 4

4

您似乎正在寻找这些:

于 2011-09-27T14:19:28.943 回答
3

实际上,我在我的一个项目中经常做这种事情。不过,我使用 Products.SmartPrintNG 和 fop 并没有按照产品使用的标准方式进行操作(我认为它使用 javascript 来启动转换......很奇怪)。

几件事:

  • 我不得不清理输出,因为 fop 非常敏感
  • 用过lxml
  • 我的使用原型

无论如何,我用于创建 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')
于 2011-09-27T14:32:08.163 回答
2

Produce and Publish Lite 是独立的开源代码,是 SmartPrintNG 的继承者。 http://pypi.python.org/pypi/zopyx.smartprintng.lite/

于 2011-09-28T06:07:11.993 回答
0

使用 z3c.rml,可以很好地从 rml 模板生成 pdf,而不是从可能很棘手的 html 转换。

于 2011-09-29T06:08:33.427 回答