为了大家少走弯路,也为了自己以后拿来看,故写此文来帮你我跳过各种坑!
1.工具:
首先说下我用的开发工具是
TIBCO Jaspersoft Studio-6.1.1.final (构建Jrxml源文件,jasper生成工具),ireport的进化版,在官网可以下载得到。
2.Jar包:
2.1我用的maven打包的,故贴出dependencies和所需repository
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> ------------------------------------------------------- <repository> <id>jboss</id> <name>Jboss Repository</name> <url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository>
2.2当然你也可以在官网和其他第三方仓库直接下载
3. 假如一切顺利,我假设你已经下载了所有依赖的jar包,并设计好所需要的.jrxml源文件,生成了.jasper文件。
(Jaspersoft Studio的使用,这里我推荐百度文库的一篇文档(搜索关键词Jaspersoft Studio pdf)
3.1假设你要打印一些用户信息,我们配置一下控制器
Controller里面的printPdf()方法,让他返回一个ModelAndView。
@RequestMapping(value = "/print", method = { RequestMethod.GET }) public ModelAndView printPdf(ModelMap modelMap) { List<User> listUsers=new ArrayList<User>(); User user=new User(); user.setUsername("张三"); user.setAge(15); listUsers.add(user); modelMap.addAttribute("datasource", listUsers); return new ModelAndView("userReport",modelMap); }
3.2接下来我们配置一下ViewResolver,那么pdfViewResolver将帮助我们完成view的返回,其中basename=views指定了jasper文件的配置路径,
你需要在classpath下面创建一个名为views.properties的文件。因为你的项目除了要返回pdf ,还可能返回html,jsp,velocity,freemarker等模板,
所以一般你的项目肯定还有另外一个viewResolver。
<bean id="pdfViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <property name="order" value="0"></property> <property name="basename" value="views"></property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="1"/> <property name="prefix" value="/templetes/"/> <property name="suffix" value=".html"/> <property name="contentType" value="text/html"/> </bean>
请注意,ResourceBundleViewResolver,InternalResourceViewResolver的order属性,InternalResourceViewResolver的优先级必须排在最低级,
否则就提示404了,只走InternalResourceViewResolver。
3.3其中我们在3.2提到的views.properties文件需要做如下配置
#设置报表输出格式 userReport.(class)=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView #设置报表文件路径 userReport.url=/WEB-INF/classes/reports/userReport.jasper #数据的key值 userReport.reportDataKey=datasource
4.设置中文显示字段的显示属性
4.1 网上很多教程教你在设计时,修改每个中文static text Advanced中的PDF属性,
pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"
这里,我教大家一个简易快捷的方法,无需频繁为每个字段编辑属性,由Design切换到source编辑页面,在你的jrxml源文件中加入以下配置(配置在<property/>定义结束之后即可)
<style name="myStyle" isDefault="true" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
假如上述一切顺利,我相信你一定可以直接在浏览器返回符合要求的PDF页面了,你可以离开这个页面去分享或者拷贝个笔记了。
如果很不幸,你的中文显示还有问题,继续读吧!
5.因为版本选择的原因,中文的显示可能还有问题,为了解决can not load font, 我走过的一些坑
举一些例子
5.1 )假如你乐呵呵的使用了相对新的jasperreports的jar包是5.6.0,那么根据这个链接
http://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/5.6.0
看到的依赖中,maven帮我们下载的jar包中,有一个
com.lowagie/itext/2.1.7.js2赫然在列,
你发现很多资料说支持中文要加入itextAsian的jar包,
你找了半天发现com.itextpdf方便加入依赖,
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
所以,你选择了itext-asian,于是乎中文还是显示不了还报错了。
5.2)为了解决包名不匹配的原因,网络上教你破拆itextpdf itext-asian,改部分包名为lowagie
,
又或者
下载lowagie
itextAsian.jar ,
然后
mvn install安装在本地repository,一切为了迎合com.lowagie/itext/2.1.7.js2 或者com.lowagie/itext/2.1.7
,
产生这个问题的原因是,itext版本不兼容。
根据http://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/你会发现,jasperreports自6.0.0版本才启用itextpdf包名的itext包,
jasperreports6.0.0版本itext最低依赖是5.5.0的itextpdf,直接摒弃了
com.lowagie/itext/2.1.7
,而jasperreports 6.0.0之前的版本,例如5.6.0,依旧依赖的是
com.lowagie/itext/2.1.7,如果你使用包名中含有itextpdf的itext-asian.5.2.0.jar,当然是没法和包名中含有lowagie
的itext/2.1.7.jar相兼容的。
5.3)当然也有人教你修改jasperreports中的font.xml源文件,指定自己的字体在项目中的路径,还要重新打包。
为了解决这个问题,检索中外文资料累半死,写此文为了我们不再走弯路,节省宝贵时间。
如果对你有用,从内心里谢谢我吧。
如果实在帮到你了,我也不介意亮出我的支付宝二维码,你懂得!
欢迎关注我的微信公众号-搜索 “前端琅琊阁“ 即可
注:本文写的是直接在浏览器返回PDF web页,关于直接下载PDF的方式,你可以参考我推荐的百度文库文档, 其他资料也蛮多的。
相关参考链接: