jasper綜合使用-javabean結合實際業務-解決PDF中文

前言:

之前寫了2篇關於JasperSoft的文章,當時調通了,以爲萬事大吉了就放了一段時間。

結果等到現在用的時候重新撿起來發現問題是真的多,下面就一一羅列一下。

前2篇文章傳送門:jasperreport JAVA API集成到spring boot中

jasperreport+jaspersoft生成報表並集成到spring boot中

一 PDF中文問題

之前的技術是Jasper 5.6.0版本,解決中文用了itext-2.1.7.js2.jar和

itextasian-2.1.7.js2.jar兩個文件,而且需要自己手動maven安裝也很麻煩。但是

這次我按照這個方法配置的時候竟然死活出不來中文,只好放棄,另尋辦法。

參考Jasperreports6.3.1+Jaspersoft studio6.3.1進行報表開發實戰教程(七)-PDF中文顯示

Jasperreports6.4.1+Jaspersoft studio6.4.1進行報表開發實戰教程-PDF中文顯示

這2篇乾貨之後發現了一個比較好的辦法。懶的話,可以直接看我下面總結的辦法。

1.1 給jaspersoft studio添加中文字體。

核心:安裝jaspersoft studio,然後手動添加中文字體,比如微軟雅黑,然後給模板中涉及到

中文的地方設定字體爲新增加的字體。

首先搞到自己想要的字體,網上下載或者windows系統裏複製也行,我用的是ttf格式,ttc的沒試

過,估計也能用。

如下圖打開jaspersoft studio的設置


點擊add,找到準備好的字體。


給編輯器增加好自己的字體後,中文顯示的時候選擇剛添加的字體即可


這樣一來在studio裏面預覽的時候就能展示中文了。


1.2 java API 使用中文字體

如下圖在resources或classes下增加一些文件。


1.2.1 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.msyh=jaspertemplate/fonts/fonts.xml
第一行不用改,打開SimpleFontExtensionsRegistryFactory可以看到定義了這2個配置。

net.sf.jasperreports.extension.simple.font.families. 是關鍵字,後面的內容隨便寫都行,建議和字體名稱一樣。

後面的value指向fonts.xml文件,使用相對路徑即可。

1.2.2 fonts.xml

<?xml version="1.0" encoding="UTF-8"?>

<fontFamilies>
  <fontFamily name="msyh"><!--字體名稱-->
    <normal>jaspertemplate/fonts/msyh.ttf</normal><!--字體文件的路徑-->
    <bold>jaspertemplate/fonts/msyh.ttf</bold>
    <italic>jaspertemplate/fonts/msyh.ttf</italic>
    <boldItalic>jaspertemplate/fonts/msyh.ttf</boldItalic>
    <pdfEncoding>Identity-H</pdfEncoding><!--這裏的定義就與上面1.1的圖設置相匹配了-->
    <pdfEmbedded>true</pdfEmbedded>
    <exportFonts>
      <export key="net.sf.jasperreports.html">'msyh', Arial, Helvetica, sans-serif</export>
      <export key="net.sf.jasperreports.xhtml">'msyh', Arial, Helvetica, sans-serif</export>
    </exportFonts>
  </fontFamily>
</fontFamilies>
這裏有意思的是,我的字體文件是msyh.ttf,上面配置的時候用的是msyh.TTF,注意這裏的

大小寫區別。使用TTF的配置在macos和windows均測試通過,但是部署到遠端centos時會報

net.sf.jasperreports.engine.util.JRFontNotFoundException:

Font ‘msyh‘ is not available to the JVM. See the Javadoc for more details.

遍尋網上解決辦法,花了2天沒一個能解決問題。後來改了小寫與文件名匹配後就能展示了。

如果不信的可以自己改了試試。

1.2.3 放入之前下好的ttf文件即可

以上3步即可解決中文字體問題。如果是添加多個字體也是一樣的操作。


二 使用javabean作爲數據源

我前面2篇文章提到了2種連接數據的方式,

1 使用報表模板自身配置好的sql語句

2 在java中創建DataSource dbSource並執行代碼寫好的sql語句

但是實際業務中會複雜的多,需要考慮到權限等等。

我目前的業務需求是在列表頁查詢數據並勾選某幾條進行打印。

核心是調用已經寫好的查詢數據接口返回data數據,將其塞到JRBeanCollectionDataSource

中作爲數據源即可。這樣就能很好的與現有的業務邏輯相結合。

  @GetMapping("/order")
  public ModelAndView getOrderReport(final ModelMap modelMap,
      @RequestParam("reportName") final String reportName,
      @RequestParam("format") final String format,
      @RequestParam("code") final List<String> codeList) {
    List<PurchaseOrderData> list = new ArrayList<>();
    if (CollectionUtils.isNotEmpty(codeList)) {
      for (String code : codeList) {//根據訂單號查詢訂單信息,可改成自己的業務邏輯
        PurchaseOrderData orderData = purchaseOrderFacade.getPurchaseOrderByCode(code);
        list.add(orderData);
      }
      JRDataSource jrDataSource = new JRBeanCollectionDataSource(list);
      modelMap.put("datasource", jrDataSource);
      modelMap.put("format", format);
      return new ModelAndView(reportName, modelMap);
    }
    return null;
  }
上面的邏輯是根據傳過來的訂單號獲取訂單信息,並打印到報表,僅供參考。

需要注意的是:比如PurchaseOrderData裏定義了

String a;

Integer b;

....

等屬性,那麼在設計報表的時候每一個field和類型都需要一一對應。



這兩個地方對應上之後,設計報表就可以無需寫任何sql,只要你的bean有數據就可以直接展示。

------------------------------------------------------------------------------------------------------------------------------

個人記錄一下方便以後自己查看。

如果有做複雜點的報表比如子報表等可以看我的下一篇文章。

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