最近搞了一個項目,需要生成投保電子憑證的pdf文件,之前在項目也用了這個組件,只是很多年前別人開發的,我只是項目負責人而已,想起以前的項目就找了ireport這個做爲生成pdf的工具。一開始搗鼓了好久,中文不顯示出來,加粗失效問題困擾很久,終於兩天時間把他設計完了,主要是模板改的版本太多,其實這個東西真的挺簡單的。不多說了,直接上代碼。
<!-- jasperreports Start -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.0.0</version>
</dependency>
<!--字體加粗的依賴包-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.9</version>
</dependency>
<!--生成pdf組件包:iText.jar -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>4.2.1</version>
</dependency>
<!--中文字體包:iTextAsian.jar-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- jasperreports end -->
調用代碼
/**
* @FileName testController.java
* @Description:
*
* @Date 2020年2月22日
* @author pangxianhe
*
*/
@RestController("testController")
@RequestMapping("/ireport")
@Api(value = "ireport測試", tags = "ireport測試")
public class testController extends BaseController<DtsWbRequestEntity> {
@GetMapping("exportPdf")
public void exportPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 獲取容器資源解析器
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
org.springframework.core.io.Resource[] resources = resolver.getResources("ireport/21.jasper");
org.springframework.core.io.Resource[] resourcestb = resolver.getResources("img/tb.png");
org.springframework.core.io.Resource[] resourceswb = resolver.getResources("img/wb.png");
InputStream stream = resources[0].getInputStream();
URI streamtb = resourcestb[0].getURI();
URI streamwb = resourceswb[0].getURI();
Map<String, Object> map=new HashMap<String, Object>();
map.put("policyno", "9231989100");
map.put("username", "賢哥");
map.put("idtype", "身份證");
map.put("idcard", "458015");
map.put("tbimg", streamtb);
map.put("wbimg", streamwb);
map.put("signingdate", "2020-2-23");
map.put("starendtime", "2020 年 02 月 25 日 00 時-2021 年 02 月 24 日 24 時");
JasperPrint jasperPrint = JasperFillManager.fillReport(stream, map, new JREmptyDataSource());
byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
}
}
以上代碼基本上搞定,接下來需要注意的是設計的時候的小細節了
中文顯示不出來,需要設置下這個,也可以在xml中全局添加這個
具體的代碼如下:
<style name="Base" isDefault="true" fontSize="10" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
接下來解決加粗之後的字體不剩下的問題,具體什麼原因不顯示,大家可以百度下,接下來很簡單的一個設置即可,選擇這個類型的文本即可。
最後補充一個小技巧給大家,
static text如何設置邊框呢?然後堆成一個表格呢,接下來記住下面幾段代碼,好像在軟件中沒這個設置,我是找不到的。
z在xml中找到你要添加的邊框靜態字體的上方添加如下代碼即可生產邊框。代碼如下:
<box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box>
效果圖我就不貼了,以上,如有說漏請留言互相交流。謝謝