At the moment I have done the following steps:
1. Downloaded the xhtmlrenderer library and placed it in webapps/ufs/WEB-INF/lib
2. Created a new folder in webapps/ufs/WEB-INF/classes called formservlets and placed the file Html2Pdf.class in this folder. This is a servlet that should convert a html string parsed by a post-request to a PDF.
3. Placed the file ConvertHtml2Pdf.class in the customfunctions directory
4. Added the following to the web.xml
Code: Select all
<filter-mapping>
<filter-name>EbaseFilter</filter-name>
<url-pattern>/Html2Pdf</url-pattern>
</filter-mapping>
Code: Select all
<servlet>
<servlet-name>Html2Pdf</servlet-name>
<servlet-class>formservlets.Html2Pdf</servlet-class>
</servlet>
Code: Select all
<servlet-mapping>
<servlet-name>Html2Pdf</servlet-name>
<url-pattern>/Html2Pdf</url-pattern>
</servlet-mapping>
6. Added customfunction with "Maintain functions" within Ebase Designer.
The custom functions should parse the following two paramteres: "URL to CSS", "HTML to be placed in body of HTML document". The customfunction should create a popup which calls the Html2Pdf servlet.
My hope was that this would trick. But unfortunately it did not. The log does not show any errors. I hope someone here is able to help me with this.
Customfunction - ConvertHtml2Pdf.java
Code: Select all
package com.ebasetech.ufs.customfunctions;
import java.util.Stack;
import org.nfunk.jep.ParseException;
import com.ebasetech.ufs.function.UFSCustomFunction;
import com.ebasetech.ufs.kernel.BrowserPopUp;
import com.ebasetech.ufs.kernel.Form;
import com.ebasetech.ufs.kernel.FormException;
import com.ebasetech.ufs.kernel.UFSFormInterface;
import com.ebasetech.ufs.utility.HttpUtil;
public class ConvertHtml2Pdf extends UFSCustomFunction {
public ConvertHtml2Pdf(UFSFormInterface formInterface) {
super(formInterface);
numberOfParameters = 2;
}
public void run(Stack inStack) throws FormException, ParseException {
checkStack(inStack);
Object param2 = inStack.pop();
Object param1 = inStack.pop();
if (param1 instanceof String && param2 instanceof String) {
String css = param1.toString();
String html = param2.toString();
String content = "<html>" +
"<head>" +
"<link rel='stylesheet' type='text/css'" +
"href='" + css + "' media='print' />" +
"</head>" +
"<body>" + html + "</body></html>";
Form form = new Form();
form.setPopup(new BrowserPopUp(HttpUtil.encodeURL("Html2Pdf?content=" + content)));
inStack.push("OK");
} else {
throw new ParseException("Invalid parameter type");
}
}
}
Code: Select all
package formservlets;
import com.ebasetech.ufs.kernel.*;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.w3c.dom.Document;
@SuppressWarnings("serial")
public class Html2Pdf extends HttpServlet {
public Html2Pdf() {
}
private void displayError(HttpServletRequest request,
HttpServletResponse response, String errorMessage)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println(" <HEAD>");
out.println("<TITLE>Error notification page</TITLE>");
out
.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">");
out.println("<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">");
out.println("<META HTTP-EQUIV=\"Cache-Control\" CONTENT=\"no-cache\">");
out.println("<META HTTP-EQUIV=\"Expires\" CONTENT=\"0\">");
out.println(" </HEAD>");
out.println("<BODY>");
out.println((new StringBuilder("Unexpected error in HTML to PDF conversion: "))
.append(errorMessage).toString());
out.println("</BODY>");
out.println("</HTML>");
out.close();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@SuppressWarnings("deprecation")
public void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
FormStack formStack = EbaseFormSession.getFormSession(request)
.getFormStack();
Form form = null;
if (formStack != null) {
form = formStack.peekForm();
}
if (form == null) {
displayError(request, response, "No Ebase form active");
return;
}
response.setContentType("application/pdf");
String content = request.getParameter("content");
StringBuffer buf = new StringBuffer();
buf.append(content);
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
renderer.layout();
OutputStream os = response.getOutputStream();
renderer.createPDF(os);
os.close();
} catch (Exception e) {
throw new ServletException(e.getMessage(), e);
}
}
}