dependencies at pom.xml
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.6.5</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
package com.blogspot.na5cent.htmltopdf;
import com.lowagie.text.pdf.BaseFont;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.io.FileUtils;
import org.apache.tools.ant.filters.StringInputStream;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
/**
*
* @author redcrow
* @link : http://na5cent.blogspot.com/2013/05/exporter-convert-html-to-pdf-java.html
* @createDate : 08/05/2013
*/
public class Exporter {
private static final Logger LOG = Logger.getLogger(Exporter.class.getName());
private String style = "";
private Boolean landscape = false;
private List<String> fonts;
private String encoding = "UTF-8";
private int fontSize = 14;
private String content;
private String fileName = "report";
private Exporter(String content) {
this.content = ieInnerHTML(content).replace("<br>", "<br/>");
}
public static Exporter from(String html) {
return new Exporter(html);
}
/**
* add style(CSS) into report
*
* @param stylePath
* @return ReportUtils
* @throws IOException
*/
public Exporter addStyle(String stylePath) throws IOException {
style += FileUtils.readFileToString(new File(stylePath), "UTF-8");
return this;
}
/**
* set font size for report (default font size is "14pt")
*
* @param size
* @return Exporter
*/
public Exporter setFontSize(int size) {
fontSize = size;
style += "*{font-size:" + this.fontSize + "pt;}";
return this;
}
/**
* set file name for report (default file name is "report")
*
* @param fileName
* @return Exporter
*/
public Exporter setFileName(String fileName) {
this.fileName = fileName;
return this;
}
/**
* @param fonts (path of font) (default location is "class path")
* @return Exporter
*/
public Exporter setFont(List<String> fonts) {
this.fonts = fonts;
return this;
}
/**
* @param font (path of font) (default location is "class path")
* @return Exporter
*/
public Exporter addFont(String font) {
if (fonts == null) {
fonts = new ArrayList<String>();
}
fonts.add(font);
return this;
}
/**
* set encoding for report (default encoding is "UTF-8")
*
* @param encoding
* @return Exporter
*/
public Exporter setEncoding(String encoding) {
this.encoding = encoding;
return this;
}
public void toPDF(HttpServletResponse response) throws Exception {
response.setContentType("application/pdf");
response.setCharacterEncoding(encoding);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
String source = removeBlank(getReportContent());
System.out.println("source : " + source);
Document doc = builder.parse(new StringInputStream(source, encoding));
ITextRenderer renderer = new ITextRenderer();
if (fonts != null) {
ITextFontResolver fontResolver = renderer.getFontResolver();
for (String font : fonts) {
fontResolver.addFont(font, BaseFont.IDENTITY_H, true);
}
}
renderer.setDocument(doc, null);
renderer.layout();
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
renderer.createPDF(outputStream);
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
public void toCSV(HttpServletResponse response) {
response.setContentType("text/csv");
response.setCharacterEncoding(encoding);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".csv");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
outputStream.print(formatData(content));
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
public void toExcel(HttpServletResponse response) {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding(encoding);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
InputStream inputStream = new StringInputStream(removeHref(getReportContent()), "UTF-8");
int byteInt;
byte[] buf = new byte[1024];
while ((byteInt = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, byteInt);
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
public void toTxt(HttpServletResponse response) {
response.setContentType("text/plain");
response.setCharacterEncoding(encoding);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".txt");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
outputStream.print(formatData(content));
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
/**
* set landscape display (default is "Portrait")
*
* @return Exporter
*/
public Exporter toLandscape() {
landscape = true;
return this;
}
/**
* set portrait display (default is "Portrait")
*
* @return Exporter
*/
public Exporter toPortrait() {
landscape = false;
return this;
}
//==========================================================================
private String ieInnerHTML(String html) {
StringBuffer stringBuffer = new StringBuffer();
//replace uppercase html tag
Pattern compile = Pattern.compile("<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)\\/?>");
Matcher matcher = compile.matcher(html);
while (matcher.find()) {
matcher.appendReplacement(stringBuffer, matcher.group().toLowerCase());
}
matcher.appendTail(stringBuffer);
//replace attribute without quote (id=val -> id="val" )
compile = Pattern.compile("\\=[a-zA-Z\\.\\:\\[\\]_\\-\\(\\)\\&\\$\\%#\\@\\!0-9]+[?\\s+|?>]");
matcher = compile.matcher(stringBuffer.toString());
stringBuffer = new StringBuffer();
while (matcher.find()) {
String text = matcher.group();
matcher.appendReplacement(stringBuffer, "=\"" + text.substring(1, text.length() - 1) + "\"" + text.charAt(text.length() - 1));
}
matcher.appendTail(stringBuffer);
return stringBuffer.toString();
}
private String removeBlank(String content) {
return content.replaceAll(" ", "");
}
private String getReportContent() {
if (landscape) {
style += "@page {size: 11.69in 8.27in;}";
} else {
style += "@page {size: 8.27in 11.69in;}";
}
StringBuilder builder = new StringBuilder();
builder.append("<html><head><style type='text/css'>");
builder.append(style);
builder.append("</style></head><body>");
builder.append(content);
builder.append("</body></html>");
System.out.println("html : " + content);
return builder.toString();
}
private String formatData(String input) {
// replace " with “
String regexp = "[\"]";
String output = input.replaceAll(regexp, "“");
//HTML
output = output.replaceAll("\n", "");
output = output.replaceAll(">[\\s]+", ">");
output = output.replaceAll("<tr", "\n<tr");
regexp = "</t[d|h]>[^>]*<t[d|h]";
output = output.replaceAll(regexp, "</td>,<td");
regexp = "<[^\\<]+\\>";
output = output.replaceAll(regexp, "");
return output;
}
private String removeHref(String input) {
String regexp = "<[^<]a+>";
String output = input;
output = output.replaceAll(regexp, "");
regexp = "<a[^<]+>";
output = output.replaceAll(regexp, "");
return output;
}
}
Example to use
ToPdfService.java
package com.blogspot.na5cent.htmltopdf;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author redcrow
*/
@WebServlet(urlPatterns = "/toPdfService")
public class ToPdfService extends HttpServlet {
private static final Logger LOG = Logger.getLogger(ToPdfService.class.getName());
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
request.setCharacterEncoding("UTF-8");
String html = request.getParameter("html");
//**********************************************************************
Exporter.from(html)
.addStyle(getServletContext().getRealPath("barStyle.css"))
.addFont("ANGSAU.TTF")
.addFont("ANGSAUB.TTF")
.toPDF(response);
//**********************************************************************
} catch (Exception ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
index.jsp (ส่ง html ไปยัง server เพื่อแปลงเป็น pdf)<%--
Document : index
Created on : May 7, 2013, 7:24:56 PM
Author : redcrow
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="barStyle.css" rel="stylesheet"/>
<script src="jquery.js"></script>
<script src="barChart.js"></script>
<script>
var bar = new BarChart({
title : 'na5cent bar chart',
xText : 'x text',
yText : 'y text',
colors : ['red', 'green'],
averageText : '',
height: 200,
width : 300,
meaning: ['mean1', 'mean2'],
data: [
{
name: 'name1',
bar: [
{
name: 'd11',
value: 20
},
{
name: 'd12',
value: 50
}
]
},
{
name: 'name2',
bar: [
{
name: 'd21',
value: 10
},
{
name: 'd22',
value: 80
}
]
},
{
name: 'name3',
bar: [
{
name: 'd31',
value: 80
},
{
name: 'd32',
value: 40
}
]
},
{
name: 'name4',
bar: [
{
name: 'd41',
value: 100
},
{
name: 'd42',
value: 67
}
]
}
]
});
$(function() {
$('#bar').html(bar.html());
});
function copydata() {
$('#html').html(bar.html());
}
</script>
</head>
<body>
<div id="bar"></div>
<form method="post" action="${pageContext.request.contextPath}/toPdfService">
<textarea id="html" name="html"></textarea>
<button type="submit" onclick="copydata();">send</button>
</form>
</body>
</html>
พอดี barChart ผมเขียนเองน่ะครับ เดี๋ยวไว้ว่างๆ ผมจะเอา code มา share ให้ดูครับ ^___^

ไม่มีความคิดเห็น:
แสดงความคิดเห็น