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 Horizontally和Center Vertically按钮后,控件Static Text设置了理想的对齐方式,效果如图1.16所示。
设置完成后,单击左上角的"保存"按钮 保存这个模板文件。
至此报表的模板文件就创建完成了。
1.2.2 在Web项目中以PDF文件显示出来(1)
虽然模板文件report1.jrxml创建结束了,但此时的模板文件并不能使用,必须编译成report1.jasper文件才可以,所以单击Preview预览按钮生成.jasper文件,预览的效果如图1.17所示。
然后在桌面上即可创建出文件。
虽然创建出了.jasper,但还是有一个非常重要的遗留问题,即:刚才是在iReport中进行预览,并且正确显示出中文,那如果用Adobe Reader软件预览PDF文件呢,是否还能正确显示出中文呢?
选择Preview→PDF 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 name、Pdf Embedded、Pdf Encoding。
设置完成后再添加亚洲字体支持,这里需要两个.jar文件,如图1.22所示。
然后选择"工具"→"选项"命令,打开Classpath选项卡,单击Add JAR按钮添加亚洲字体.jar文件的支持,效果如图1.23所示。
选择两个字体支持.jar文件,效果如图1.24所示。
选择font选项卡然后按图示点击,最后选择需要支持的字体
单击"确定"按钮应用设置。
设置完毕后一定要重启iReport软件,以加载最新的配置,再重新运行PDF即可正确显示出中文,效果如图1.25所示。
以上步骤说明在PDF文件中已正确显示了中文字体,下一步就是创建一个Web项目,然后引入这个.jasper文件,将生成的PDF在IE上显示出来就可以了。
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.jar和iTextAsianCmaps.jar文件复制到Web项目的lib文件夹下,重启Tomcat并刷新IE,显示出正确的中文效果,
然后在lib文件夹下面添加ttf字体文件即可.