3

ユーザーが新しいドキュメントを作成し、フォームに入力した後、PDFが生成されてダウンロードできるように、コンテンツタイプ(重要な場合は器用に作成)からPDFを作成する必要があります。したがって、基本的にドキュメントを作成/変更した後、PDFを作成してZODBに保存し(実際にはblobを使用しています)、ビューを「PDFとしてダウンロード」にリンクできるようにする必要があります。

PDFNodeを見たことがありますが、探しているものではないようです。Produce&Publishもありますが、これはWebサービス(?)であり、これを開発する会社は、(プライバシーのために)データセンターの外部にデータを送信することを望んでいません。

何か案が?

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を使用すると、扱いにくいhtmlから変換する代わりに、rmlテンプレートからpdfを生成するのに非常にうまく機能します。

于 2011-09-29T06:08:33.427 に答える