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.
To install xhtml2pdf
, add the following to your buildout eggs
directory::
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.
.. _collective.sendaspdf buildout
: https://github.com/zestsoftware/collective.sendaspdf/
If wkhtmltopdf
is not on your path, you can set an environment
variable in your buildout config::
[instance]
...
zserver-threads = 7
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.
.. _jquery.pyproxy: https://pypi.python.org/pypi/jquery.pyproxy
Configuring
Go to the Plone control panel. You will find a 'Send as PDF' link that
sends you to the products configuration page.
This page proposes a few settings, among which:
-
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:
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 possibility to add an adapter that will generate default
options for PDF generation.
Adapter must implement ISendAsPDFOptionsMaker. [vincent]
-
Added layout options when generating files with wkhtmlaspdf. Options
available are: use book style, generate table of contents, margins.
Those options can be overriden in download links. [vincent]
-
Added utility to replace relative URL and include images as data in
the img tag. [vincent]
-
Enabled possibility to render table of contents and book style using
GET arguments. [vincent]
-
Added Italian translation [giacomos]
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 in TinyMCE loading with Plone 4. [vincent]
-
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]
-
Display a file name based on the context's title when downloading
the page. [Giacomo Spettoli]
-
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)
2.2 (2011-04-05)
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]
-
Added header 'X-Robots-Tag': 'noindex' in downloaded file to avoid
having it indexed by search engines. [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]
-
added Ajax version of "Download as PDF" link. [vincent]
-
added Ajax version of the "Send as PDF" link. [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)
1.0 (2010-07-21)
-
added Dutch and French translations [vincent+mark]
-
added view to send by mail and download the page. [vincent]
-
added document actions to send the page by mail and download as
pdf. [vincent]
-
Added sendaspdf tool to manage preferences. [vincent]