An open source product for Plone to download or email a page seen by the user as a PDF file.

Introduction

collective.sendaspdf is an open source product for Plone that allows downloading the page seen by the user as a PDF file. It also provides a form to send the page by e-mail (a screenshot of the current page in a PDF format being joined to the e-mail).

It relies on either of two products to generate the PDF files:

The site manager can easily choose which solution he prefers for the generation.

Installing

To install the package, you can simply add collective.sendaspdf to the eggs list in your buildout. Then install it using Zope’s quick installer or Plone’s add-on products manager.

pisa
pyPdf
html5lib
reportlab

collective.sendaspdf has been tested with development versions of pisa and html5lib. With the latest releases (when writing this README - html5lib 0.9 and pisa 3.0.33) some pages could not be rendered.

To install wkhtmltopdf, go to the projects page and download an executable version for your OS. Install it so the command wkhtmltopdf is in the PATH.

You can also update your buildout to automatically download and install wkhtmltopdf and have it used by your instance. This may be tricky. Look at our own collective.sendaspdf buildout for how to do this.

If wkhtmltopdf is not on your path, you can set an environment variable in your buildout config:

[instance]
...
environment-vars =
...
WKHTMLTOPDF_PATH /path/to/your/wkhtmltopdf

Additionally, as you can see in this configuration, the zserver-threads number has been pushed to 7. This avoids troubles with threads locks when multiple PDFs are rendered at the same time. 7 threads work fine when rendering 5 PDFs of the same page at the same time.

jquery.pyproxy dependency

We have jquery.pyproxy as dependency. It will work without it: we do not install it by default. If you install it yourself, the links to send or download as pdf will use ajax, making the interaction a bit faster and more userfriendly.

Configuring

Go to the Plone control panel. You will find a ‘Send as PDF’ link that sends you to the products configuration page.

• the tool used to render the PDF files.

• the directory where the PDF files are stored.

• the sentence used as salt when hashing the user’s emails (this hash is used to know which files a user can access)

• the name used in the mail for the PDF file.

• a default title/body for the mails.

• a list of browser for which the attachment name should not be given. Somehow, Chrome considers the PDF generated by the tool as potentially harmful for the computer if the attachment name is specified. Adding Chrome here avoids getting a warning.

For wkhtmltopdf user, two extra options are available:

• always use the print CSS to render the PDF.

• use the print CSS for a given set of objects.

xhtml2pdf always use the print CSS.

Compatibility

This product has been tested with Plone 3 and Plone 4. Starting at version 2.6, we will only ensure compatibility with Plone 4, at least in the tests.

For developers

You can find some extra documentation in collective/sendaspdf/tests/adapter.txt. It explains how to define custom options in the request or with an adapter.

Testing

If you want to run the sendaspdf test suite, you need to add ‘pdfminer’ in the list of eggs in the buildout.

On Plone3, this is my configuration for running the tests (packages do not seem to be mandatory as the eggs are taken from the zeoclient section):

[test]
recipe = collective.recipe.z2testrunner
zope2part = zeoclient
packages =

And on Plone 4:

[test]
recipe = zc.recipe.testrunner
eggs =
${zeoclient:eggs} defaults = ['--auto-color', '--auto-progress'] environment = environment [environment] WKHTMLTOPDF_PATH=${wkhtmltopdf:location}/wkhtmltopdf

Changelog

3.0 (2015-06-24)

• Fixed killing wkhtmltopdf when it takes too long. [maurits]

• Added upgrade step: put our control panel action in the Products (addons) category. And give it a proper icon (gif on Plone 3, png on Plone 4). Set the default on install to png so it is best for Plone 4. Same for the tool icon in portal_types. [maurits]

• Fixed javascript error for undefined tinymce due to typo. Note that on Plone 4 we currently cannot load TinyMCE. [maurits]

• Warn when sending mail failed. [maurits]

• Added option to rewrite https links. If style sheets or images are not visible in the pdf, this option may help. This is a simple replacement of https:// in the entire page source, so we may replace more than you want. Issue #19 [maurits]

• Fix timeout as the Popen kill method was never called [avoinea]

• Add uninstall profile in order to clean and easily uninstall this package [avoinea]

• In the test buildout, use wkhtmltopdf 0.12.2.1 (OSX) or 0.12.2 (Linux). Our test buildout does some funky stuff to install the package in a directory within the buildout. You may want to just manually install the package for your OS instead. We do that in Travis. We are experiencing problems with the 64 bit version, so we are using the 32 bit version. [maurits, jean]

• Make it compatible with wkhtmltopdf 0.12.0 and improved logging on errors [avoinea]

• Added possibility of disabling auto cleanup step. Can be set in the plone control panel. Default is enabled. [olimpiurob]

2.10 (2014-01-20)

• Pass --encoding utf-8 to wkhtmltopdf. Fixes possible encoding error. [jean]

2.9 (2013-09-27)

• First try to import pisa from the newer xhtml2pdf library. Note that it can be hard for both libraries, including their dependencies, to find versions that work on Python 2.4 (Plone 3). Generally, wkhtmltopdf is recommended. [maurits]

• No longer convert everything to ascii for pisa. [maurits]

• Do the possible encoding to utf-8 in one spot, before calling a html_to_pdf transform method. [maurits]

• Do not use deprecated clean_string from jquery.pyproxy anymore. Requires jquery.pyproxy 0.3 or higher. [maurits]

• When no view_name is given, do not try to get the immediate view, but just display the context. This will let the standard Zope and Plone machinery do its work. Do the same when traversing to ‘view’ does not work even though viewing this url works just fine. That can happen in some cases. [maurits]

• Moved code to https://github.com/zestsoftware/jquery.pyproxy [vincent, maurits]

2.8 (2012-11-01)

• added pep8/pyflakes checks fo Travis based on collective.polls config. [vincent]

• pep8/pyflakes [vincent + maurits]

• Added option to allow passing the authentication cookie to wkhtmltopdf. This fixes some issues with images hidden inside non-public folder (but that the user can see in the normal page). [vincent]

2.7.2 (2012-10-18)

• Fix exception syntax for Python 2.4 (Plone 3). [vincent]

2.7.1 (2012-10-18)

• Fixed timeout issue. [vincent]

2.7 (2012-10-17)

• added some more random in the temporary file generation to avoid issue with multiple concurrent runs. [vincent]

• added a timeout on the subprocess + put stdout/err in TemporaryFile to avoid potential issues. [vincent]

• raised number of zserver-threads in default buildout, that prevents the server locking. [vincent]

• Added bootstrap/buildout based on collective/tutorial.todoapp (https://github.com/collective/tutorial.todoapp). [vincent]

2.6 (2012-06-15)

• Updated Dutch translations. [Thom van Ledden]

• fix generating local urls with anchors [Davide Moro]

• Bugfix in update_relative_urls [Davide Moro]

2.5 (2012-03-29)

• Fixed generating pdf name [kroman0]

• Added utility to replace relative URL and include images as data in the img tag. [vincent]

2.4.2 (2011-12-09)

• Bugfix is JS bindings to download the PDF, it now uses the correct context. [vincent]

• Bugfix when the context title contains non-ascii characters. Zope does not accept those characters in set_header [vincent+Vladislav]

2.4.1 (2011-12-07)

• Bugfix when checking if the attachment name should be providen, ‘self.excluded_browser_attachment’ does not seem to work on every instances, used ‘self.getExcluded_browser_attachment()’ instead. [vincent]

• Fixed test runners for Plone 4. [vincent]

2.4 (2011-11-22)

• Added a setting in send as PDF tool so we can exclude some browser when forcing file name. This will mainly usefull for Chrome, as this one considers PDF generated with the tool as potentially harmful files. The same problem will certainly appear with Chromium. [vincent]

• Added some functional tests. [vincent]

• Don’t repeat POST parameters anymore. [vincent]

2.3.1 (2011-06-27)

• Bugfix with Unicode (again) and Ajax. [vincent]

2.3 (2011-05-25)

• Bugfix when not using secure mail host. [Yuri]

• Bugfix with wk transforms for encoding. [Khairil Yusof]

2.2 (2011-04-05)

• Fixed encoding to avoid being limitated to ASCII. [mauriziolupo]

• Added a generic setup handler for sendaspdftool and import/export preferences. [mauriziolupo]

2.1.1 (2010-12-23)

• added a target (sic :/) attributes on the link to preview the PDF so it opens in a new window. That’s prety ugly, but the fact is that if a user clicks on the link with IE and Acrobat reader installed, it will open the PDF in the same window. Hitting the ‘back’ button will display the page without the Ajax form. [vincent]

• in the Ajax popup, we do not try to initialize tinymce is an error happenned. [vincent]

• another IE bugfix due to an extra comma + CSS opacity fix [vincent]

2.1 (2010-12-15)

• also added meta tag robots:noindex on the forms. [vincent]

• Bugfix when sumbitting the Ajax form with TinyMCE. [vincent]

2.0.1 (2010-11-11)

• Bugfix in jquery.sendaspdf.js - removed one comma that was causing an error in IE. [vincent]

2.0 (2010-10-22)

• compatibility fixes with Plone4. [vincent]

• Removed the ‘-C’ parameter. [yuri + vincent]

1.1 (2010-09-16)

• when the PDF generation failed in the page to send by mail, we display an error page instead of failing. [vincent]

• bugfix in send page - it was impossible to load the Wysiwyg for anonymous users. Stole some code from POI to solve it. [vincent]

1.0.3 (2010-08-02)

• Fix broken release with missing files. (Now released with setuptools-git installed.) [mark]

1.0.2 (2010-08-02)

• updated egg information in setup.py (author and description). [mark]

1.0.1 (2010-08-02)

• registered the translations so they are applied. [mark]

1.0 (2010-07-21)

• added Dutch and French translations [vincent+mark]

• Added sendaspdf tool to manage preferences. [vincent]

Project details

Uploaded source