Jasperreport 与Springmvc结合生成PDF web页面笔记(含解决中文问题)

 
为了大家少走弯路,也为了自己以后拿来看,故写此文来帮你我跳过各种坑!
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源文件,指定自己的字体在项目中的路径,还要重新打包。

其实完全不用这么麻烦,只要采用我推荐jar包配置就可以了。

为了解决这个问题,检索中外文资料累半死,写此文为了我们不再走弯路,节省宝贵时间。
如果对你有用,从内心里谢谢我吧。 如果实在帮到你了,我也不介意亮出我的支付宝二维码,你懂得!

欢迎关注我的微信公众号-搜索 “前端琅琊阁“ 即可


注:本文写的是直接在浏览器返回PDF web页,关于直接下载PDF的方式,你可以参考我推荐的百度文库文档, 其他资料也蛮多的。
相关参考链接:







猜你喜欢

转载自blog.csdn.net/napoleonjk/article/details/51133347
今日推荐