Springboot 集成JasperReport 6.7 及中文顯示不出來問題解決

概述:

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工程的配置就完成了,可以再次運行,結果如下:

 

這時我們可以看到 設置爲華文宋體的控件已經能顯示出中文了,沒有設置華文宋體的還是沒有顯示出中文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章