--- a/web/views/basetemplates.py Thu Aug 20 14:30:45 2009 +0200
+++ b/web/views/basetemplates.py Thu Aug 20 14:48:35 2009 +0200
@@ -13,7 +13,7 @@
from cubicweb.appobject import objectify_selector
from cubicweb.selectors import match_kwargs
from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW
-from cubicweb.utils import make_uid, UStringIO
+from cubicweb.utils import make_uid, UStringIO, can_do_pdf_conversion
# main templates ##############################################################
@@ -266,6 +266,44 @@
self.w(u'</td>\n')
self.w(u'</tr></table>\n')
+if can_do_pdf_conversion():
+ from xml.etree.cElementTree import ElementTree
+ from subprocess import Popen as sub
+ from StringIO import StringIO
+ from tempfile import NamedTemporaryFile
+ from cubicweb.web.xhtml2fo import ReportTransformer
+
+ class PdfMainTemplate(TheMainTemplate):
+ id = 'pdf-main-template'
+
+ def call(self, view):
+ """build the standard view, then when it's all done, convert xhtml to pdf
+ """
+ super(PdfMainTemplate, self).call(view)
+ pdf = self.to_pdf(self._stream)
+ self.req.set_content_type('application/pdf', filename='report.pdf')
+ self.binary = True
+ self.w = None
+ self.set_stream()
+ # pylint needs help
+ self.w(pdf)
+
+ def to_pdf(self, stream, section='contentmain'):
+ # XXX see ticket/345282
+ stream = stream.getvalue().replace(' ', ' ').encode('utf-8')
+ xmltree = ElementTree()
+ xmltree.parse(StringIO(stream))
+ foptree = ReportTransformer(section).transform(xmltree)
+ foptmp = NamedTemporaryFile()
+ pdftmp = NamedTemporaryFile()
+ foptree.write(foptmp)
+ foptmp.flush()
+ fopproc = sub(['/usr/bin/fop', foptmp.name, pdftmp.name])
+ fopproc.wait()
+ pdftmp.seek(0)
+ pdf = pdftmp.read()
+ return pdf
+
# page parts templates ########################################################
class HTMLHeader(View):
@@ -489,4 +527,6 @@
## vregistry registration callback ############################################
def registration_callback(vreg):
- vreg.register_all(globals().values(), modname=__name__)
+ vreg.register_all(globals().values(), __name__, (PdfMainTemplate,) )
+ if can_do_pdf_conversion():
+ vreg.register(PdfMainTemplate)