Objective:
Export Journal Content/Web Content as PDF.
Liferay have
feature to export journal content as PDF.
Liferay already have support to export journal
content as PDF document but we need to do open office configuration.
Here we are doing without help of open office configuration.
With help of JTidy and Flying Saucer we
will export general content as PDF with zero configurations.
Download Export Jorinal Content portlet from following location
You can find source and war file
Note:
Portlet developed in Liferay 6.1GA2 EE version
If you want deploy in CE version you just do changes in liferay-plugin-package.properties
Liferay 6.1 EE version
name= ExportJournalContentAsPDF
module-group-id=liferay-ee
module-incremental-version=1
tags=
short-description=
change-log=
page-url=http://www.liferay.com
author=Liferay, Inc.
licenses=EE
portal-dependency-jars=\
jstl-api.jar,\
jstl-impl.jar
portal-dependency-tlds=c.tld
liferay-versions=6.1.20
|
Liferay 6.1 CE version
name = ExportJournalContentAsPDF
module-group-id=liferay
module-incremental-version=1
tags=
short-description=
change-log=
page-url=http://www.liferay.com
author=Liferay, Inc.
licenses=LGPL
portal-dependency-jars=\
jstl-api.jar,\
jstl-impl.jar
portal-dependency-tlds=c.tld
liferay-versions=6.1.1
|
Procedure for deploy
portlet:
You can use war file and directly place in your portal deploy folder and
test or you can also use source to deploy portlet.
Once portlet is deployed successfully you can see the portlet in sample
category name as
Export Jorinal Content.
JTidy:
JTidy is java based library for cleaning up
malformed and faulty HTML and JTidy provides a DOM interface to the document
that is being processed, which effectively makes you able to use JTidy as a DOM
parser for real-world HTML.
Go through following link to get more information
about JTidy.
Flying Saucer:
Flying Saucer is java library to generate PDF from HTML
and XML. This is pretty interesting library to generate PDF very easy
way even complex PDF too. Generally
we can design content in
HTML the same thing we can
generate as PDF.
Go through following
link to get more information about flying
saucer
Why we are using JTidy with Flying Saucer?
Generally when we use
HTML in flying saucer that should be
well formed, if any syntax errors or any other malformed data then it won’t be
exported as PDF.
Generally when we generate PDF with help of
flying saucer we mostly getting html content as dynamic, so we need to use JTidy
to clean HTML, means to correct syntax errors and clean malformed data.
Steps to generate PDF
- Get html contents from any sources
- Convert html data as Input Stream
- Apply JTidy to cleans html data make it as well formed w3c document.
- Pass w3c document to flying saucer to generate PDF.
Get html contents from any sources:
First we need to get
HTML data from any sources we can use any URL to get html data mean its string
of html tags.
Example:
We can manually prepare
html data as string or we get html data from any URL.
String html = HttpUtil.URLtoString(“http://www.liferaysavvy.com/2013/11/liferay-document-conversion-portlet.html”);
|
String html = ""<!DOCTYPE
HTML><<html><head><title>First
parse</title></head>"
+
"<body><p>This is test HTML.</p></body></html>";
|
Convert html data as Input Stream:
Now once get html
content as String now we need convert string to input stream
String html = ""<!DOCTYPE
HTML><<html><head><title>First
parse</title></head>"
+
"<body><p>This is test HTML.</p></body></html>";
InputStream is = new ByteArrayInputStream(html.getBytes());
|
Apply JTidy to cleans html data make it as well
formed w3c document
String html = ""<!DOCTYPE
HTML><<html><head><title>First
parse</title></head>"
+
"<body><p>This is test HTML.</p></body></html>";
InputStream is = new
ByteArrayInputStream(articleHtml.getBytes());
Tidy tidy = new Tidy();
org.w3c.dom.Document doc = tidy.parseDOM(is,
null);
|
Pass w3c document to flying saucer to generate
PDF
OutputStream outputStream =
resourceResponse.getPortletOutputStream();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
renderer.layout();
renderer.createPDF(outputStream);
|
Note:
This process can apply anywhere
to generate PDF from HTML using flying saucer.
The following is complete example to export journal
content as PDF
import
java.io.ByteArrayInputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
javax.portlet.PortletException;
import
javax.portlet.ResourceRequest;
import
javax.portlet.ResourceResponse;
import
com.liferay.portal.kernel.language.LanguageUtil;
import
com.liferay.portal.kernel.util.ParamUtil;
import
com.liferay.portal.kernel.util.StringPool;
import
com.liferay.portal.kernel.util.WebKeys;
import
com.liferay.portal.theme.ThemeDisplay;
import
com.liferay.portlet.journal.model.JournalArticleDisplay;
import
com.liferay.portlet.journalcontent.util.JournalContentUtil;
import
com.liferay.util.bridges.mvc.MVCPortlet;
import
com.lowagie.text.DocumentException;
import
org.w3c.dom.Document;
import
org.w3c.tidy.Tidy;
import
org.xhtmlrenderer.pdf.ITextRenderer;
public class
ExportJorinalContentAction extends
MVCPortlet {
@Override
public void
serveResource(
ResourceRequest
resourceRequest, ResourceResponse resourceResponse)
throws
IOException, PortletException {
String
articleId=ParamUtil.getString(resourceRequest,"webContentSelectBox");
ThemeDisplay
themeDisplay = (ThemeDisplay)resourceRequest.getAttribute(WebKeys.THEME_DISPLAY);
long
groupId =ParamUtil.getLong(resourceRequest,"sitesSelectBox");
try {
//get
journal article
JournalArticleDisplay
articleDisplay = JournalContentUtil.getDisplay(groupId, articleId, "",
LanguageUtil.getLanguageId(resourceRequest),themeDisplay);
//set
up response to handle PDF
resourceResponse.reset();
resourceResponse.setContentType("application/pdf");
resourceResponse.setProperty("Content-disposition", "attachment;
filename=\"" + articleDisplay.getTitle().concat(StringPool.PERIOD).concat("pdf")
+ "\"");
OutputStream
outputStream = resourceResponse.getPortletOutputStream();
String articleHtml = "<!DOCTYPE
HTML><html><body>"+articleDisplay.getContent()+"</body></html>";
//prepend
portal URL to local document library relative URLs
articleHtml =
articleHtml.replaceAll("src=\"/documents", "src=\""+themeDisplay.getPortalURL()+"/documents");
Tidy tidy = new
Tidy();
//
Create inputStream to parse with tidy.
InputStream is = new
ByteArrayInputStream(articleHtml.getBytes());
//
Create XML Document from tidy
Document doc =
tidy.parseDOM(is, null);
//render
PDF
ITextRenderer renderer
= new ITextRenderer();
renderer.setDocument(doc,
null);
renderer.layout();
renderer.createPDF(outputStream);
} catch
(DocumentException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
Important points
- With the help of JTidy and Flying saucer we can generate PDF from HTML
- We can also apply CSS to html in flying saucer.
- Without configuration of open office in Liferay we can export Journal Content as PDF with the help of Flying saucer.
I have written Article about flying saucer.
Note:
In above
example I did not use JTidy to clean HTML but better use JTidy to clean HTML
and pass to flying saucer so that we can get PDF without any problems.
Screens:
Journal
Content Export Portlet
Example
Journal Content for Export
Example
PDF after Export
Reference Links:
0 comments :
Post a Comment