How to create a PDF document for each tab
Intended Audience
Users who need to generate one printable document aggregated from a group of documents.
Purpose
By default Forrest generates a pdf file for each separate document of your project. As well you can create a pdf of the whole site. But sometimes it may be necessary to generate a pdf file out of selected tab, i.e. only for certain parts of the site.
Prerequisites
- Understand how to create project-specific sitemaps by following the Using Forrest document.
Steps
The procedure outlined below will define a project sitemap.xmap and create a new pdf-tab.xmap.
Create your project's main sitemap.xmap
If you do not have already a sitemap then create a new empty one in your src/documentation directory (or wherever ${project.sitemap-dir} points to).
Create another sitemap: pdf-tab.xmap
Like before create an empty sitemap and name it pdf-tab.xmap.
Edit project sitemap.xmap to mount pdf-tab.xmap
Your sitemap should look something like this.
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0"> <map:pipelines> <map:pipeline internal-only="false"> <map:match pattern="**.xml"> <!-- pdf-tab definitions --> <map:match pattern="pdf-tab.xml"> <map:mount uri-prefix="" src="pdf-tab.xmap" check-reload="yes" /> </map:match> <!-- end of pdf-tab definitions --> </map:match> </map:pipeline> </map:pipelines> </map:sitemap>
Edit the file pdf-tab.xmap
The <map:match pattern="*.xml"> element should look like the following:
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0"> <map:pipelines> <map:pipeline internal-only="false"> <map:match pattern="*.xml"> <map:generate src="cocoon://abs-linkmap"/> <map:transform type="xpath"> <map:parameter name="include" value="//*[@wholesite='true']"/> <map:parameter name="exclude" value="//*[@wholesite='false']"/> </map:transform> <map:transform src="resources/stylesheets/site2book.xsl" /> <map:transform src="resources/stylesheets/aggregates/book2cinclude.xsl"> <map:parameter name="title" value="{conf:project-name}: Still My Foo Site"/> </map:transform> <map:transform type="cinclude"/> <map:transform src="resources/stylesheets/aggregates/doc2doc-uniqueids.xsl"/> <map:transform src="resources/stylesheets/aggregates/docs2document.xsl"/> <map:serialize type="xml"/> </map:match> </map:pipeline> </map:pipelines> </map:sitemap>
Edit your site.xml
Add the following entry to your site.xml in the <about> element
... <whole_foosite href="pdf-tab.html" label="sub site" />
Your site.xml should look like this ...
... <about label="About"> <index label="Index" href="index.html" description="Welcome to MyProj"/> <changes label="Changes" href="changes.html" description="History of Changes" /> <todo label="Todo" href="todo.html" description="Todo List" /> <whole_foosite href="pdf-tab.html" label="pdf-tab" /> </about> ...
This allows you to link to it via a <link href="site:whole_foosite"> reference.
Add to every element that should be included in the pdf-tab.pdf the attribute wholesite="true"
<sample-wiki label="Wiki page" href="wiki-sample.html" description="wiki-sample" wholesite="true"/>
Explanation of the operation
Line 4 of our example
<map:parameter name="include" value="//*[@wholesite='true']"/>
looks at your site.xml and will match every element containing
the wholesite="true" attribute. For example, to use the
"samples" tab ...
... <samples label="Samples" href="samples/" tab="samples" wholesite="true"> ... </samples> ...
It matches all of the elements that contain wholesite="true" (in our example <samples> and its "children") for the content of the pdf file to be generated.
<samples label="Samples" href="samples/" tab="samples" wholesite="true"> <sample2 label="Static content" href="sample2.html" description="More Samples" wholesite='false'/> <sample-wiki label="Wiki page" href="wiki-sample.html" description="wiki-sample" /> <sample-ihtml label="ihtml page" href="ihtml-sample.html" description="Test iHTML page" /> </samples>
This example shows that you can as well exclude site(s) from the aggregation by using the wholesite="false" attribute. This attribute will be as well inherited by all children of the element.
Line 8 defines the title of the pdf file by taking the content of the
project-name variable in skinconf.xml and adding some funny
text:
<map:parameter name="title" value="{conf:project-name}: Still My Foo Site"/>
Feedback and further development of this How-To
Please provide feedback about this document via the mailing lists.
In the future, this ability will probably be incorporated into the main Forrest process.