利用Flying Saucer 和 iText 实现生成PDF报表
来源:互联网 发布:linux打包命令 编辑:程序博客网 时间:2024/04/29 13:46
在做系统的时候,由于是电子政务,很多时候都需要将数据制作成PDF的文档,然后在各个部门之间盖章。我使用的是采用Itext生成pdf。
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。iText的安装非常方便,下载jar文件后,只需要在系统的CLASSPATH中加入jar的路径,在程序中就可以使用iText类库了。
但是中途又遇到了一些问题。这个控件使用起来很简单,它的简单实例如下:
用iText生成PDF文档需要5个步骤:
①建立com.lowagie.text.Document对象的实例。
Document document =new Document();
②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PDFWriter.getInstance(document,new FileOutputStream("Helloworld.PDF"));
③打开文档。
document.open();
④向文档中添加内容。
document.add(newParagraph("Hello World"));
⑤关闭文档。
document.close();
通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"HelloWorld"。
上面只是一个简单的实例,还达不到项目需求的功能。在项目中需求是这样的,使用kindeditor(一个文本编辑器)将客户编辑的数据,连同格式一起存入数据库,然后再在数据库将这段html代码读取出来。打印成pdf。
这里面有几个关键点:
1.存入数据库的是编辑器产生的html代码片段,它生成什么代码,不好控制,而且生成的不是标准的html文档,只是一个部分,没有html头信息等。
2.解析的时候是将html取出来,然后生成pdf文档,再供用户下载。
3.需要一个html解析器,把html翻译成页面形式,防止到pdf中。要不pdf会把html代码也打印出来。
解决这几个技术点,我采用以下办法。
1.将从数据库读取出来的html代码去合并html头信息等。这样就参数一个标准的html文档,包括html,title,body标签等。
2.然后使用ITextRenderer将组合的字符串解析成pdf。存入mongodb数据库。
3.从mongoDB数据库中读取pdf文件,下载下来。
这里需要注意的就是,kindeditor生成的标签有的有问题,解析不了,比如font-family就不能解析。所以需要编辑htmlTag属性,把她去掉。具体方法请见:http://wolf123.blog.163.com/blog/static/17505429820127305757/
实现代码如下:
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.FileOutputStream;import java.io.OutputStream;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;import org.xml.sax.SAXException;import com.lowagie.text.DocumentException;import com.lowagie.text.pdf.BaseFont;/** * 将html字符串解析成pdf,返回文件流。采用单例模式 * @ClassName: DownloadMDBPDF * @author * @date 2012-11-29 下午08:34:48 */public class DownloadMDBPDF{private static DownloadMDBPDF instance = null;private DownloadMDBPDF() {}public static DownloadMDBPDF getInstance() {if (instance == null) {instance = new DownloadMDBPDF();}return instance;}/** * @throws SAXException * @throws IOException * @throws DocumentException * 取值 * @param @param key * @param @return * @return String * @throws */public InputStream createPDFS(String content) throws DocumentException, IOException, SAXException {long startTime = System.currentTimeMillis(); // 获取开始时间String outputFile = "D:/MT_applications/MT/temp.pdf";OutputStream os = new FileOutputStream(outputFile);ITextRenderer render = new ITextRenderer();ITextFontResolver fontResolver = render.getFontResolver();fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);StringBuffer html = new StringBuffer();// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">").append("<head>").append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />").append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;margin:10px 10px 10px 10px;}");html.append("p {margin:5px 0;}");html.append("table {border-collapse:collapse;}");html.append("img {border:0;}");html.append("noscript {display:none;}");html.append("table.ke-zeroborder td {border:1px dotted #AAA;}");html.append("</style>").append("</head>").append("<body>");html.append(content);html.append("</body></html>");long endTime = System.currentTimeMillis(); // 获取结束时间System.err.println("程序运行时间: " + (endTime - startTime) + "ms-----------");// 解析html生成pdfrender.setDocumentFromString(html.toString());render.layout();render.createPDF(os);os.close();// 将生成的pdf读取成输出流,供客户端下载。File file = new File(outputFile);InputStream is = new FileInputStream(file);endTime = System.currentTimeMillis(); // 获取结束时间System.err.println("程序运行时间: " + (endTime - startTime) + "ms------------");return is;}}
上面返回的是输出流。这个输出流需要存入mongoDB数据库中。然后使用的时候读取下了。关于mongoDB的读写在以后的文章中介绍。
- 利用Flying Saucer 和 iText 实现生成PDF报表
- 利用Flying Saucer 和 iText 实现HTMl转PDF(java)
- 利用Flying Saucer 和 java iText 实现HTMl转PDF
- itext+Flying Saucer生成pdf
- Flying Saucer生成pdf报表
- iText和flying saucer结合生成pdf的技术
- iText和flying saucer结合生成pdf的技术
- iText和flying saucer结合生成pdf的技术
- iText和flying saucer结合生成pdf的技术
- itext+flying saucer 生成PDF不换行
- flying saucer生成pdf
- 利用Freemarker、itext和Flying saucer导出复杂表格的PDF格式文档
- 基于iText和flying saucer结合freemark java生成pdf 范例
- iText+Flying Saucer生成pdf文档,中文不显示和不自动换行问题
- 使用 itext、flying-saucer 实现html转PDF
- 使用Flying Saucer生成pdf
- freemarker+flying-saucer生成pdf
- 利用iText生成PDF报表
- 单向散列函数(Hash)
- 读刘未鹏博客反思和总结(看书,思考,写博文)
- 连接外部数据库
- Linux下的中断
- Java之美[从菜鸟到高手演变]之HashMap、HashTable
- 利用Flying Saucer 和 iText 实现生成PDF报表
- LINUX下XAMPP访问被禁,如何修改配置文件
- 解决CMake为VC准备生成文件时的Could not copy from不能复制问题
- Android培训---运行你的应用程序
- JDBC高级开发(2)---编写自己的JDBC框架
- android应用后台安装,静默安装的代码实现方法
- PHP封装wsdl文件,PHP调用web service
- 自己写的一个memset函数
- c++ 使用TinyXml读写Xml