""" dulcinea/lib/ui/make_pdf.py """ from qp.fill.html import href from qp.fill.static import StaticFile from qp.lib.util import get_output from qp.mail.send import sendmail, msg_part from qp.pub.common import get_response,get_request, get_site, get_publisher, get_path, get_fields, get_user from os.path import exists from time import time from tempfile import NamedTemporaryFile download_pdf_path = '/download_pdf' # Path that executes download_pdf(). phantomjs_path = '/usr/local/bin/phantomjs' def pdf_converter_exists(): return exists(phantomjs_path) def download_pdf_link:xml(title="PDF of This Page", download_pdf_path=download_pdf_path, paper_width=None, paper_height=None, margin=None, zoom=None, **kwargs): if exists(phantomjs_path): path = "%s?path=%s" % (download_pdf_path, get_path()) if paper_width: path += '&paper_width=%s' % paper_width if paper_height: path += '&paper_height=%s' % paper_height if margin: path += '&margin=%s' % margin if zoom: path += '&zoom=%s' % zoom href(path, title, **kwargs) def phantomjs_script:str( view_port_width=850, view_port_height=1100, paper_width="8.5in", paper_height="11in", margin="0in", zoom=1, cookie_name=None, cookie_value=None, cookie_domain=None, cookie_path=None, cookie_expires=None, cookie_httponly=None, cookie_secure=None, url=None, output_path=None, user_agent=None, ): "var page = require('webpage').create()\n" "page.viewportSize = { width: %s, height: %s }\n" % ( view_port_width, view_port_height) "page.paperSize = { width: '%s', height: '%s', margin: '%s' }\n" % ( paper_width, paper_height, margin) "page.zoomFactor = %s\n" % zoom "page.settings.userAgent = '%s'\n" % user_agent "page.cookies = [{ name: '%s', value: '%s', " % ( cookie_name, cookie_value) "domain: '%s', path: '%s', " % ( cookie_domain, cookie_path) "expires: '%s'," % cookie_expires " httponly: '%s', secure: '%s' }]\n" % ( cookie_httponly, cookie_secure) "page.open('%s', function (status) {\n" % url " if (status != 'success') {\n" " console.log(status + ': ' + '%s')\n" % url " } else {\n" " window.setTimeout(function () {\n" " page.render('%s')\n" % output_path " console.log('%s')\n" % output_path " phantom.exit()\n" " }, 200)\n" " }\n" "})\n" def download_pdf(path=None, paper_width="8.5in", paper_height="11in", margin="0in", zoom=0.7): pdf_path = NamedTemporaryFile(suffix=".pdf").name make_pdf(path=path, output_path=pdf_path, paper_width=paper_width, paper_height=paper_height, margin=margin, zoom=zoom) path = get_fields().get('path') or path or '/' url = get_publisher().complete_url(path) filename = url.split('//', 1)[1].replace('/', '_').strip('_') + '.pdf' get_response().set_header('Content-Disposition', 'inline; filename="%s"' % filename) return StaticFile(pdf_path, mime_type="application/pdf")() def make_pdf(path=None, output_path=None, paper_width="8.5in", paper_height="11in", margin="0in", zoom=0.7): fields = get_fields() paper_width = fields.get('paper_width', paper_width) paper_height = fields.get('paper_height', paper_height) margin = fields.get('margin', margin) zoom = fields.get('zoom', zoom) path = fields.get('path') or path or '/' url = get_publisher().complete_url(path) cookie_name = get_site().get_name() cookie_value = get_request().get_cookie(cookie_name) host = get_request().get_header('Host') user_agent = get_request().get_header('User-Agent') script = NamedTemporaryFile(suffix=".js") script_src = phantomjs_script( paper_width=paper_width, paper_height=paper_height, margin=margin, cookie_name=cookie_name, cookie_value=cookie_value, cookie_path='/', cookie_domain=host, cookie_expires=int(time() + 1000), cookie_httponly='false', cookie_secure='true', output_path=output_path, zoom=zoom, url=url, user_agent=user_agent) script.write(script_src) script.flush() command = "%s --ignore-ssl-errors=yes %s" % (phantomjs_path, script.name) result = get_output(command, verbose=True, include_stderr=True) return result def email_pdf(recipients=None, path=None, paper_width="8.5in", paper_height="11in", margin="0in", zoom=0.7): if recipients is None: recipients = [get_user().get_email() or get_publisher().get_webmaster_address()] pdf_path = NamedTemporaryFile(suffix=".pdf").name make_pdf(path=path, output_path=pdf_path, paper_width=paper_width, paper_height=paper_height, margin=margin, zoom=zoom) path = get_fields().get('path') or path or '/' url = get_publisher().complete_url(path) filename = url.split('//', 1)[1].replace('/', '_').strip('_') + '.pdf' text = "Here is a PDF of %s\n" % url text += 'as seen by %s.\n\n' % get_user().get_id() part1 = msg_part(mime_type='text/plain', body=text, charset=None, encode=False) part2 = msg_part( body=open(pdf_path).read(), filename=filename, encode=True, mime_type='application/pdf', charset='iso-8859-1') sendmail( 'PDF of %s' % url, [part1, part2], to_addrs=recipients, mime_type='multipart/mixed', charset=None, from_addr=get_publisher().get_webmaster_address()) return url