概述:
JasperReport作为java报表生成工具,还是具有很多优点的,当然相比于其他收费报表工具,JasperReport最主要的优点是开源免费,下面介绍下如何用JasperReport生成一个pdf文档
步骤:
1、生成JasperReport模板:
我这里使用的是JasperReport Studio工具,原来用的iReport在几年前已经停止更新了。
下载地址:
https://community.jaspersoft.com/project/jaspersoft-studio
进行安装后,可以新建一个工程,然后新建Jasper Report模板:
工程结构如下:
这里的report1.jrxml是我刚新建的jasper report模板
这时我们可以在工作区编缉这个模板:
这里我简单的拖动了两个控件,一种是StaticText,另一种是Text Field控件。
其中Text Filed中的$F{NAME}, $F{INFO} 可以通过如下方式设置,一会代码中有用:
分别取名为NAME和INFO:
做到这里,一个简单的Jasper Report模板文件生成好了
注意:
1、Jasper Report可以直接设置数据库来源,我这里没做设置,通过在代码中指定数据的形式集成
关于中文设置,这里我们设置的Static Text是有中文的,我分别设置了宋体 和 其他字段,如下:
2、代码集成:
jasper需要的pom.xml如下:
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
注意这里的itext 2.1.7,在jasperreports中itext-2.1.7.js6一直集成失败
pom配置好后,需要集成一下report环境:
把刚才jasper studio保存的report,放到web工程的resource目录下,我的目录结构如下:
注意这里的路径哦
接下来就是写代码了:
首先写一个bean,用于刚才jasper studio中report模板中的 text field,具体如下:
public class Student {
private String NAME;
private String INFO;
public Student() {
}
public Student(String NAME, String INFO) {
this.NAME = NAME;
this.INFO = INFO;
}
public String getNAME() {
return NAME;
}
public void setNAME(String NAME) {
this.NAME = NAME;
}
public String getINFO() {
return INFO;
}
public void setINFO(String INFO) {
this.INFO = INFO;
}
}
注意这里的名字,跟刚才定义的Field名字一样。
定义一个Service,用于生成pdf报表:
@Service
public class ReportService {
public byte[] getReportPdf(final JasperPrint jp) throws JRException{
return JasperExportManager.exportReportToPdf(jp);
}
}
定义一个Controller,用于访问及返回,当然因为只是一个Demo,所以把report的初始化、配置之类的代码都放在了一起:
@RestController
public class TestController {
@Autowired
private ReportService reportService;
@GetMapping("pdfdata")
public HttpEntity<byte[]> downloadPdf() throws JRException{
Student student = new Student("Jack", "China");
List<Student> list = new ArrayList<>();
list.add(student);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
String filename = "d:\\report1.jasper";
File compiledFile = new File(filename);
JasperReport jr;
if (compiledFile.exists()){
jr = (JasperReport) JRLoader.loadObject(compiledFile);
}else{
InputStream inputStream = getClass().getResourceAsStream("/jasper/report1.jrxml");
JasperDesign jd = JRXmlLoader.load(inputStream);
jr = (JasperCompileManager.compileReport(jd));
JRSaver.saveObject(jr, filename);
}
JasperPrint jasperPrint = JasperFillManager.fillReport(jr, new HashMap<>(), dataSource);
final byte[] data = reportService.getReportPdf(jasperPrint);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline: filename=demo.pdf");
headers.setContentLength(data.length);
return new HttpEntity<>(data, headers);
}
}
这样就集成了一个能生成Jasper报表的web工程了,运行,输入http://localhost:8080/pdftest,查看结果如下:
可以发现值已经设置上去了,但是这里面没有中文
Jasper Report中文问题解决:
网上找了一圈,有各种方法 都试验了一下,发现可行性不高
1、集成itext-asian jar包,发现在jasper report 6.7版本中已经没用了
2、修改jasper report的fonts jar包,这个感觉就算了,工程是用Maven管理的,没必要搞的这么复杂
我这里的方法是,把字体文件 跟设置结合,具体操作如下:
刚才我们在jasper studio设置了一些字体,有华文宋体跟其他字体,我们可以在c:\windows\fonts中找到华文宋体
这个字体名为STSONT.TTF
把这个字体文件拷贝到web工程中,并且设置字体信息:
目录结构如下:
其中fonts.xml的配置信息如下,这个文件指定了字体信息:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="msyh"><!--字体名称-->
<normal>fonts/STSONG.TTF</normal><!--字体文件的路径-->
<bold>fonts/STSONG.TTF</bold>
<italic>fonts/STSONG.TTF</italic>
<boldItalic>fonts/STSONG.TTF</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'华文宋体', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'华文宋体', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
另外再新建一个jasperreports_extension.properties文件,里面写上:
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml
这样字体信息在web工程的配置就完成了,可以再次运行,结果如下:
这时我们可以看到 设置为华文宋体的控件已经能显示出中文了,没有设置华文宋体的还是没有显示出中文