JasperReport生成pdf
最近使用JasperReport进行pdf的导出时所出现的一些问题,网上关于这方面的资料比较少,这里记录下避免掉坑
使用工具为Jaspersoft Studio,它是一个图形化的报表设计工具,可以非常方便的设计出PDF报表模板文件(其实就是一个xml文件),再结合JasperReports使用,就可以渲染出PDF文件
- 想要动态的展示图片的话,可以加一个image,并在Experession(表达式)处填写:
数据库存的是字符串的话
new ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($F{base64_str}.getBytes()))
在数据库存的是json格式的数据的话
new ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64(net.sf.json.JSONObject.fromObject($F{base64_str}).get("key").toString().getBytes()))
需要对应的字段关联如:$F{base64_str},即可正确动态展示图片
如果你传递的不是图片文件,而是一个url链接,则还需要进行读取该链接,可以使用下面代码进行读取
/**
* 将网络图片编码为base64
*
* @param url
* @return
* @throws Exception
*/
public static String encodeImageToBase64(URL url) throws Exception {
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
//打开链接
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) url.openConnection();
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
//关闭输入流
inStream.close();
byte[] data = outStream.toByteArray();
//对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(data);
return base64;//返回Base64编码过的字节数组字符串
} catch