displaytag无法导出pdf、rtf?????? 已解决
因为做毕业设计的需要,所以从今天开始需要考虑分页处理的问题,一开始是在网上寻找可用的开源框架予以借鉴使用,于是在
经过查阅网上的许多文章资料后,我将目标锁定到了display tag上,关于display tag的用法,主要集中在几个方面:分页(含
内存分页与数据库分页)、对列排序、导出数据。
网上的相关资料确实很多,但是很多转载的文章大同小异的也很多。于是就为一些问题埋下了伏笔。
我按照网上的大部分说法,导入了相关包:
displaytag-1.2.jar
commons-lang-2.6.jar
standard.jar
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
iText-5.0.6.jar
jstl.jar
displaytag-export-poi-1.2.jar
displaytag-portlet-1.2.jar
而且还弄了个简单的实例想测试一下分页和导出功能。但是却发现怎么也无法导出pdf与rtf格式的数据(更准确的说法是页面上
只显示了csv、xml、excel的label或按钮,但是却没有显示pdf、rtf的label或按钮,故无法使用导出功能!而且在netbeans的输
出栏内,tomcat日志、服务器日志、程序输出均无提示异常!)。我的数据里面并无涉及中文。百思不得其解,在网上也没找到
合理的或相关的解释,看来看去,都是在说中文问题!
于是无奈之中,导入了iTextAsian.jar,但是发现问题依旧。
纠结之中,又检查起了web.xml的配置,发现已经正确配置,否则,它应该会抛出异常。而且我在缺省包下的
displaytag.properties文件也将相应的property set为true了,那么问题出在哪呢?
我配置如下:
#sort.behavior=list
#sort.amount=list
#basic.empty.showtable=true
#basic.msg.empty_list=No results matched your criteria.
#paging.banner.placement=top
#paging.banner.onepage=<span class="pagelinks"></span>
export.types=csv excel xml pdf rtf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.rtf=true
export.excel.class=org.displaytag.export.excel.DefaultHssfExportView
export.pdf.class=org.displaytag.export.DefaultPdfExportView
export.rtf.class=org.displaytag.export.DefaultRtfExportView
paging.banner.placement=bottom
# if set, file is downloaded instead of opened in the browser window
#export.[mymedia].filename=
为什么不行呢?
无奈之下,我只好打开了displaytag-1.2.jar内的org.displaytag.properties里的displaytag.properties文件,想将内容复制
到我新建的属性文件中去。部署项目后依旧有问题。
最后迫于无奈,检查相关export用到的class,即org.displaytag.export.excel.DefaultHssfExportView、
org.displaytag.export.DefaultPdfExportView、org.displaytag.export.DefaultRtfExportView等。
终于发现部分类内居然有些导入类缺失!原来还是缺包!不得不佩服,网上那些转载文章的,转载了,却不去测试,结果“以讹
传讹”。
几经周折,我终于发现还缺一个包,那就是itext-1.3.1.jar!!!!!!!!我在csdn里能找到相关的下载!!!!
下载地方:http://download.csdn.net/source/2819666
补上包后,发现netbeans里面对相关导入还是显示红色,但是仔细检查,确实已经导入了!部署后发现csv excel xml pdf rtf五
种格式均可导出!
(后经检查,发现itext包与iText包是等效的,提示缺包,可能是tomcat本身的bug,换了个glassfish后就没提示了。。。)
另外附上,其他有用的网址:
http://sourceforge.net/projects/itext/files/
http://sourceforge.net/projects/itext/files/extrajars/ExtraJars1.0/
http://sourceforge.net/projects/itext/files/extrajars/ExtraJars1.0/iTextAsian.jar/download
后记:当时弄的时候搞到比较晚,所以没进一步往下操作,后来点击链接后发现excel链接会出错,抛出异常如下:
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError:
org/apache/poi/hssf/usermodel/HSSFWorkbook
经检查,发现还需要导入poi-3.7-20101029.jar。于是导入。
导入后发觉问题依旧,觉得很是奇怪。
我是在项目源包内的缺省包下重新建的displaytag.properties文件,这个也是参考自网上的做法。我们知道在项目的导入包
displaytag-1.2.jar中还存在着一个更全的properties文件,而根据先前我在网上搜到的某个例子,当中在新建的属性文件中是
没有这句的:export.excel.class=org.displaytag.export.excel.DefaultHssfExportView
虽然我觉得加了或没加都一样(因为在那个更全的属性文件中也是存在这个的)。最后试来试去,还是得改为原先那个比较少内
容的属性文件,换成用比较全的那个会出错,具体原因不知道。
我的属性文件是这样写的:
#sort.behavior=list
#sort.amount=list
#basic.empty.showtable=true
#basic.msg.empty_list=No results matched your criteria.
#paging.banner.placement=top
#paging.banner.onepage=<span class="pagelinks"></span>
export.types=csv excel xml pdf rtf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.rtf=true
export.excel.filename=page.xls
export.csv.filename=page.csv
export.pdf.filename=page.pdf
export.rtf.filename=page.rtf
export.pdf.class=org.displaytag.export.DefaultPdfExportView
export.rtf.class=org.displaytag.export.DefaultRtfExportView
paging.banner.placement=bottom
# if set, file is downloaded instead of opened in the browser window
#export.[mymedia].filename=
但是在我的印象中,上次那样用好像是没问题的,另外pdf直接在浏览器上打开也会出问题,症状是网页标签自动关闭了(我用的
是360浏览器)。必须设置export.pdf.filename=XXX,以浏览器下载的方式打开。。。。。
无奈,想起今天下午刚刚更新过360浏览器与adobe reader(碰巧同一天)。。。。。。哪里出了问题呢?鬼才知道。。。。
后记:
之前的研究没有考虑中文,后来我研究了一下,发现原本用来打开excel的类是
org.displaytag.export.excel.ExcelHssfView,于是我将配置文件中的内容改回原样:
export.excel.class=org.displaytag.export.excel.ExcelHssfView
这样就能在excel中正确显示中文了。
说到这里,由于是研究输出中文乱码的问题嘛,所以有必要指出,我在这里参考了某篇文章,来源:普索网
以下是节选内容:
“
列出displaytag 1.2版中文PDF与Excel中文乱码解决方案:
Excel乱码部分(使用poi-3.2-FINAL-20081019.jar)//注意版本,否则可能提示缺少部分方法。。。。
1.请下载displaytag-export-poi-1.2.jar
2.在displaytag.properties加入export.excel.class=org.displaytag.export.excel.ExcelHssfView
PDF中文消失部分(使用iText 2.1.5)
1.请下载 iTextAsian.jar
2.请下载displaytag 1.2的source code
3.自行复制org.displaytag.export里的PdfView.java於自订的package
4.於initTable()中修改
1
smallFont = FontFactory.getFont(FontFactory.HELVETICA, 7, Font.NORMAL, new Color(0, 0, 0))
变成
1
smallFont = FontFactory.getFont("MHei-Medium", "UniCNS-UCS2-H", Font.DEFAULTSIZE);
5.在displaytag.properties加入export.pdf.class=com.kymco.displaytag.export.PdfView,其中
com.kymco.displaytag.export应改成您自己的package
”
对于上面这段话,很有借鉴意义,但是在实际使用过程中,还是遇到了问题,对于其中的“使用iText 2.1.5”,本人实践证明这
样不行,需要更旧的包,否则会抛出异常:org.apache.jasper.JasperException: javax.servlet.ServletException:
java.lang.NoSuchMethodError: com.lowagie.text.Table.setDefaultVerticalAlignment(I)V。
至于解决办法,参见这段摘自网上的话:
“
Export to PDF uses deprecated iText method
Export Application server: Apache Tomcat 6
Description: Hide Export to PDF throws
java.lang.NoSuchMethodError: com.lowagie.text.Table.setDefaultVerticalAlignment(I)V
This is a deprecated method (since iText 2.1 I think), and (Captain Obvious) it does not work with iText 5.0.1
that
”
从以上这段话我们可以得出几点结论:
一、我们之前使用的itext-1.3.1.jar很显然是旧包,而iText-5.0.6.jar是新包,而且字母t一个是大写,一个是小写。显然
displaytag需要用的是旧包,新包没用到。
二、要知道displaytag与itext分属两个框架,开发者不同,所以很显然,他们的更新速度不同步。造成我们还需要用旧包。
另外还有一个异常:org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoSuchMethodError:
com.lowagie.text.Rectangle.width()F
但是就算我用了最旧的包,也发现异常依旧。。。彻底无语了。。。
而且之前的就算是英文,导出也有问题了。早知道这样就先做好备份啦。。。
最后最后,我重新建了一个项目,按部就班,一步一步做备份后,发现并不应该抛出那些异常,看来问题是源于netbeans本身的
错误,估计是缓存,还是内部配置文件什么的记录出错了。
哎~~~~~~~记得以前遭遇过类似情况没想到这次又遇上了。。。。。。看来netbeans靠不住啊。。。。
经过我仔细检查后发现,displaytag1.2与iText5并不完全兼容,也就是说,一旦你想修改displaytag里面的类时,经常会遇到找
不到类的情况。当然直接用iText5.0.6,而不为了解决因导出数据中含有中文而出现的问题时,直接用iText5.0.6并无大碍。
只是按照网上的做法,始终无法解决csv、pdf的中文显示问题。excel倒是能通过设置:
export.excel.class=org.displaytag.export.excel.ExcelHssfView来解决。rtf本身就能正常导出。xml本身就能显示正常。
于是乎,问题就是csv乱码,pdf中文显示为空白了。
接着,附上我的属性配置:
#sort.behavior=list
#sort.amount=list
#basic.empty.showtable=true
#basic.msg.empty_list=No results matched your criteria.
#paging.banner.placement=top
#paging.banner.onepage=<span class="pagelinks"></span>
export.types=csv excel xml pdf rtf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.rtf=true
export.excel.filename=page.xls
export.csv.filename=page.csv
export.pdf.filename=page.pdf
export.rtf.filename=page.rtf
export.excel.class=org.displaytag.export.excel.ExcelHssfView
export.pdf.class=testList.PdfViewSupportAsian
export.rtf.class=org.displaytag.export.DefaultRtfExportView
paging.banner.placement=bottom
# if set, file is downloaded instead of opened in the browser window
#export.[mymedia].filename=
其中testList.PdfViewSupportAsian是修改过org.displaytag.export.PdfView而做成的。
使用时要求itext版本不能为5或以上。但是依旧无法解决中文显示为空白的问题。
我设了的displayTag库内容为:
displaytag-1.2.jar
commons-lang-2.6.jar
standard.jar
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
itext-2.1.5.jar
jstl.jar
displaytag-export-poi-1.2.jar
displaytag-portlet-1.2.jar
poi-3.2-FINAL-20081019.jar
iTextAsian.jar
最后最后,我在想:是不是应该尝试一下使用iText5?因为或许它已经支持了中文,utf8呢????但是这样就需要找到我的解
决之道才行,不能照搬别人的方案了。
……………………………………………………
杯具。。。。。。。。。。
后记:
对于以上问题,我有了新的解答,大家看我的另一篇文章:《displaytag 中文问题 探索日志 注释》
后记:
关于pdf输出中文为空白的问题,已经得到了解决。
可以参见我的另一篇文章,《displaytag 国际化 探索日志 注释》,是因为我没有正确配置属性文件的问题。系统默认的locale
是zh_CN,而我在配置时只留意了displaytag.properties,没仔细检查displaytag_zh_CN.properties,那里由于我之前编写项目
时遗留问题的关系,所以没编写正确,所以导致了问题。
后来我改正了问题之后,参见《displaytag 国际化 探索日志 注释》,我于是重试了一下《来源普索网 displaytag的export功
能中文出现乱码...》中提到的方法,发现我写的testList.PdfViewSupportAsian其效果了。
但是,这期间有几点需要留意:参见我在页面中的注释:
<%--居然可以输出pdf了,不过是在adobe9更新后,而且字体不大好看,有什么改进意见吗?
回想原先点导出pdf时,提示的是服务器没响应。
而刚才因为访问错了链接名称,所以导致页面没显示“导出pdf”按钮,这一点以后须留意。--%>
即,一开始我写错了地址栏的链接名称,后来改正了,于是可以访问了。而回想最初时,一直是提示服务器没响应的,不知道是
不是因为我之前可能配错了属性文件的缘故,现在已经无从追查,因为我做的这个不是主要项目,所以没有经常备份。
另外,那个字体不好看。而且其间adobe reader 9提示了更新中文字体库。。。
所以之前服务器无法响应的问题是因为配置问题,还是字体不支持问题,就无从追查了。
最后,那个字体好难看,换成什么才好呢?
后记:
我在网上搜到了一篇文章:《Itext中文处理pdf(转)》,按照它的提示,我将字体改为了宋体,好看多了。
具体的改法可以参见我空间中的《Itext中文处理pdf(转)(改)》