概述:
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工程的配置就完成了,可以再次運行,結果如下:
這時我們可以看到 設置爲華文宋體的控件已經能顯示出中文了,沒有設置華文宋體的還是沒有顯示出中文