【问题标题】:Generate PDF from Plone content types从 Plone 内容类型生成 PDF
【发布时间】:2011-09-29 14:08:33
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: pdf plone dexterity


    【解决方案1】:

    您似乎正在搜索这些:

    【讨论】:

    • reportlab 自 2010 年以来没有任何新的发布
    【解决方案2】:

    我实际上在我的一个项目中经常做这种事情。不过,我使用 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')
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          • 1970-01-01
          • 2010-10-08
          • 2019-10-15
          • 1970-01-01
          • 2015-06-28
          • 1970-01-01
          相关资源
          最近更新 更多