JasperReport4.6生成PDF中文

Web项目中PDF显示中文

 

本人无奈使用JasperReport4.6,因为这本书(好像也是唯一的一本国内的介绍JasperReport的书),

选择"文件"New命令,弹出一个新建打印有关资源的向导

在这里选择Report中的B

lank A4,含义是创建一个A4幅面纸张大小的模板文件,

 

 

1.2.1  创建模板文件(2

选中后单击右下角的 按钮,即打开这个模板,并且设置保存模板文件的路径,效果如图1.6所示。

 

模板文件的扩展名为jrxml,单击"下一步"按钮出现成功配置界面,效果如图1.7所示。

 

Title(标题):Title Band只在整个报表的第1页的最上面部分显示,除了第1页以外,不管报表中共有多少个页面也不会再出现Title Band中的内容。

Page Header(页头):Page Header Band中的内容将会在整个报表中的每一个页面中出现,显示的位置在页面的上部,如果是报表的第1页,Page Header中的内容将显示在Title Band的下面,除了第1页以外的其他所有页面中Page Header中的内容将显示在页面的最上端。

Page Footer(页脚):显示在当前页面的最下端。

Detail 1(详细):报表内容段,在这个Band中将要显示重复出现的内容,Detail中的内容每页都会出现。

Column Header(列头):Detail 1 Band打印的是一张表,而Column Header Band就是表中列的列头。

Column Footer(列脚):Detail 1 Band打印的是一张表,而Column Footer Band就是表中列的列脚。

Summary(统计):表格的合计段,出现在整个报表的最后一页中,在Detail 1栏的后面,一般用来统计报表中某一个或某几个字段的合计值。

1.2.1  创建模板文件(3

本示例主要实现的功能就是打印一个静态的文本,所以就像使用.NET中的WinForm一样,找到那个文本控件就可以了,在右侧的"组件面板"中可以找到显示静态文本的Static Text控件,效果如图1.10所示。

 

把它拖动到Detail 1 Band中,并且设置它的Text属性为"Hello World-你好 世界",效果如图1.11所示。

 

Static Text控件的宽高加大,可以发现文本默认是显示在控件的左上角,效果如图1.12所示。

 

可以设置属性,将文本进行水平和垂直居中对齐,效果如图1.13所示。

 

虽然文本在控件Static Text内垂直水平居中对齐了,但控件Static Text并没有在Detail 1栏垂直水平居中对齐,因此选中Static Text控件继续设置,选择"窗口"Formatting Tools命令,效果如图1.14所示。

 

在面板中设置Static Text控件垂直和水平都居中对齐,效果如图1.15所示。

 

单击Center HorizontallyCenter Vertically按钮后,控件Static Text设置了理想的对齐方式,效果如图1.16所示。

 

设置完成后,单击左上角的"保存"按钮 保存这个模板文件。

至此报表的模板文件就创建完成了。

1.2.2  在Web项目中以PDF文件显示出来(1

虽然模板文件report1.jrxml创建结束了,但此时的模板文件并不能使用,必须编译成report1.jasper文件才可以,所以单击Preview预览按钮生成.jasper文件,预览的效果如图1.17所示。

 

然后在桌面上即可创建出文件。

虽然创建出了.jasper,但还是有一个非常重要的遗留问题,即:刚才是在iReport中进行预览,并且正确显示出中文,那如果用Adobe Reader软件预览PDF文件呢,是否还能正确显示出中文呢?

选择PreviewPDF Preview命令,效果如图1.18所示。

 

然后再单击Preview按钮进行预览,如图1.19所示。

 

利用Adobe Reader软件显示出来后,可以发现中文并没有正确显示,效果如图1.20所示。

 

那如何解决呢?很简单,让iReport软件支持亚洲字体就可以了。首先是设置Static Text控件的字体属性,效果如图1.21所示。

 

1.2.2  在Web项目中以PDF文件显示出来(2

pom.xml文件:

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.rocket.jasper</groupId>
    <artifactId>jasperreport</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>4.6.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>1.7.5</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.1.5.v20140505</version>
                <configuration>
                    <scanIntervalSeconds>15</scanIntervalSeconds>
                    <defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
                    <webApp>
                        <contextPath>/jsperdemo</contextPath>
                    </webApp>
                    <reload>manual</reload>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

文件目录结构:

 

需要设置3个属性:Pdf Font namePdf EmbeddedPdf Encoding

 

设置完成后再添加亚洲字体支持,这里需要两个.jar文件,如图1.22所示。

 

然后选择"工具""选项"命令,打开Classpath选项卡,单击Add JAR按钮添加亚洲字体.jar文件的支持,效果如图1.23所示。

 

选择两个字体支持.jar文件,效果如图1.24所示。

选择font选项卡然后按图示点击,最后选择需要支持的字体

 

单击"确定"按钮应用设置。

设置完毕后一定要重启iReport软件,以加载最新的配置,再重新运行PDF即可正确显示出中文,效果如图1.25所示。

 

以上步骤说明在PDF文件中已正确显示了中文字体,下一步就是创建一个Web项目,然后引入这个.jasper文件,将生成的PDFIE上显示出来就可以了。

 

public void doGet(HttpServletRequest request, HttpServletResponse response)  

    throws ServletException, IOException   

    {   try   

        {   ServletOutputStream servletOutputStream=response.getOutputStream();  

            InputStream reportStream = getServletConfig().getServletContext()  

                .getResourceAsStream("report1.jasper");  

            JasperRunManager.runReportToPdfStream(reportStream,  

                servletOutputStream,new HashMap(), new JREmptyDataSource());  

            response.setContentType("application/pdf");  

            servletOutputStream.flush();  

            servletOutputStream.close();  

        }   

        catch (JRException e)   

        {   // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

 

 

 

页面上并没有出现应该显示的"Hello World-你好 世界"文本,而是出现如下异常:

net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :  

pdfFontName   : STSong-Light  

pdfEncoding   : UniGB-UCS2-H  

isPdfEmbedded : true 

为什么呢?因为缺少亚洲字体.jar包文件,将iTextAsian.jariTextAsianCmaps.jar文件复制到Web项目的lib文件夹下,重启Tomcat并刷新IE,显示出正确的中文效果,

然后在lib文件夹下面添加ttf字体文件即可.

posted on 2016-02-01 23:22  liujie037  阅读(562)  评论(0编辑  收藏  举报

导航