jasper打印实例2 ----通过文件字节流获得PDF格式图片

public class IspReportUtil {

public static String exportReportToByte(CommonReportHandler handler)
throws AppException {
JRDataSource dataSource = null;
if (handler.getDataList() != null && handler.getDataList().size()>0) {
dataSource = new JRBeanCollectionDataSource(handler.getDataList());// 获取数据集
} else {
dataSource = new JREmptyDataSource();
}
try {
InputStream inputStream = new FileInputStream(handler.getReportFile());
byte[] data = JasperRunManager.runReportToPdf(inputStream, handler.getParamMap(), dataSource);
return new BASE64Encoder().encode(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

接口:

list 打印的数据源 datalist

map 打印的参数MAP 

path jasper文件的路径

CommonReportHandler reportHandler = new CommonReportHandler(list, map, path);
String file = IspReportUtil.exportReportToByte(reportHandler);

FileVO fileVO = new FileVO();
fileVO.setFile(file);
fileVO.setFileName("还款明细打印");
fileVO.setUpperCase("pdf");

responseVO.setResult(fileVO);
responseVO.setSuccess(String.valueOf(i9005vo.isSuccess()));
responseVO.setMessage(i9005vo.getMessage());
return responseVO;

 

通过接口获得的返回值:

{
"msg": [],
"result": {
"file": "JVBERi0xLjQKJeLjz9MKNCAwIG9iaiA8PC9MZW5ndGggNjU2L0ZpbHRlci9GbGF0ZURlY29kZT4+\r\nc3RyZWFtCnicrVbPaxNBGF0FFfbsqZfMSaPgOr9n10MFRYUi26aJFEmqkLaJmMRDjcRQKPYooaVe\r\nPAo9i+A5N/EPEPEv8FAQL4IecpL6fbtrjWJ2s7th2JlZZmfe+94382Y5WbCvVWxGKBSsXclJpWNf\r\nvskIg17DLl6oPLRvjH9CyVpnfBLTLjEed7QIZ3LCXJxJg/HNpl1cXKxfLbX731589C/6w13Tmt/+\r\n9OjU/lzvsHwHl6ek+R+I6iq06zYHiv+MzP7DsXCUINp4DnWPo5F/R7NUaM37wyy8x1C4qxyVALT3\r\n2v85eFcePT2REwxCUp4bg7RSK949X+pWn9dqb1Zo+UqYrK2D7mn/0v33T8RghIn7k0ZMYV5OnCgV\r\nxwkxmoWXSzlxmHETgJqFo1pj52tOHKFMUkC9nR8zSCQzMRiP3w4Ot86idKvf/b28e9R4CXClB/tf\r\n8CjTk3mzRD0ipXCMmQS12W+to2PkhuKeJsLIGKjtDxbBsvwqbP3h0Vze+ABDG+14E6V89tlvtN3J\r\nMBTsogdjC9Gc5Vu/kaO1ScfmWgS9tl2ectPqJA+ymCUsHjwK+p5loMZC4ZFQhGWykA6RkbSSNB1p\r\nNGgRxxm3/+658mgWOYsFAhGUpUEIDoUGRQZ1KI1n0cz5FMfSiBTSSCkTnH7ttn+mdH2jm4WYpLi6\r\niohhb2piTGhHJPgjaGgsnVUxpZBY6PYpiCnmJdBq1XNbjqQa/44Sw6d4yu51oXWbtTq8sI3DTIfL\r\ndSM9wvBS6MGlcthUVIHsDKhyriOqQqVMHTM0UDX2hoqoaqAKroVUwbqyUWUKr0OJPgt2hb00PotU\r\n8adv8rUTUGWWG6hqQlV1HNXprzs4fZNxqwf1/tRX3C+tO4RgCmVuZHN0cmVhbQplbmRvYmoKMSAw\r\nIG9iajw8L1BhcmVudCA1IDAgUi9Db250ZW50cyA0IDAgUi9UeXBlL1BhZ2UvUmVzb3VyY2VzPDwv\r\nUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0vRm9udDw8L0YxIDIg\r\nMCBSL0YyIDMgMCBSPj4+Pi9NZWRpYUJveFswIDAgNTk1IDg0Ml0+PgplbmRvYmoKNiAwIG9ialsx\r\nIDAgUi9YWVogMCA4NTQgMF0KZW5kb2JqCjIgMCBvYmo8PC9CYXNlRm9udC9IZWx2ZXRpY2EvVHlw\r\nZS9Gb250L0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9TdWJ0eXBlL1R5cGUxPj4KZW5kb2JqCjcg\r\nMCBvYmo8PC9Gb250QkJveCBbLTI1IC0yNTQgMTAwMCA4ODBdL0NhcEhlaWdodCA4ODAvU3R5bGU8\r\nPC9QYW5vc2UoAQUCAgQAAAAAAAAAKT4+L1R5cGUvRm9udERlc2NyaXB0b3IvU3RlbVYgOTMvRGVz\r\nY2VudCAtMTIwL0ZsYWdzIDYvRm9udE5hbWUvU1RTb25nLUxpZ2h0L0FzY2VudCA4ODAvSXRhbGlj\r\nQW5nbGUgMD4+CmVuZG9iago4IDAgb2JqPDwvQmFzZUZvbnQvU1RTb25nLUxpZ2h0L0NJRFN5c3Rl\r\nbUluZm88PC9PcmRlcmluZyhHQjEpL1JlZ2lzdHJ5KEFkb2JlKS9TdXBwbGVtZW50IDQ+Pi9XIFsx\r\nWzIwN10xNyAyNiA0NjJdL1R5cGUvRm9udC9TdWJ0eXBlL0NJREZvbnRUeXBlMC9Gb250RGVzY3Jp\r\ncHRvciA3IDAgUi9EVyAxMDAwPj4KZW5kb2JqCjMgMCBvYmo8PC9EZXNjZW5kYW50Rm9udHNbOCAw\r\nIFJdL0Jhc2VGb250L1NUU29uZy1MaWdodC1VbmlHQi1VQ1MyLUgvVHlwZS9Gb250L0VuY29kaW5n\r\nL1VuaUdCLVVDUzItSC9TdWJ0eXBlL1R5cGUwPj4KZW5kb2JqCjUgMCBvYmo8PC9UeXBlL1BhZ2Vz\r\nL0NvdW50IDEvS2lkc1sxIDAgUl0+PgplbmRvYmoKOSAwIG9iajw8L05hbWVzWyhKUl9QQUdFX0FO\r\nQ0hPUl8wXzEpIDYgMCBSXT4+CmVuZG9iagoxMCAwIG9iajw8L0Rlc3RzIDkgMCBSPj4KZW5kb2Jq\r\nCjExIDAgb2JqPDwvTmFtZXMgMTAgMCBSL1R5cGUvQ2F0YWxvZy9QYWdlcyA1IDAgUj4+CmVuZG9i\r\nagoxMiAwIG9iajw8L0NyZWF0b3IoSmFzcGVyUmVwb3J0cyBcKHBheU9mZkRhdGFcKSkvUHJvZHVj\r\nZXIoaVRleHQxLjMuMSBieSBsb3dhZ2llLmNvbSBcKGJhc2VkIG9uIGl0ZXh0LXBhdWxvLTE1NFwp\r\nKS9Nb2REYXRlKEQ6MjAxODA3MjYxMDQ0NTcrMDgnMDAnKS9DcmVhdGlvbkRhdGUoRDoyMDE4MDcy\r\nNjEwNDQ1NyswOCcwMCcpPj4KZW5kb2JqCnhyZWYKMCAxMwowMDAwMDAwMDAwIDY1NTM1IGYgCjAw\r\nMDAwMDA3MzggMDAwMDAgbiAKMDAwMDAwMDkzNyAwMDAwMCBuIAowMDAwMDAxMzk2IDAwMDAwIG4g\r\nCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMTUxOSAwMDAwMCBuIAowMDAwMDAwOTAzIDAwMDAw\r\nIG4gCjAwMDAwMDEwMjQgMDAwMDAgbiAKMDAwMDAwMTIxNCAwMDAwMCBuIAowMDAwMDAxNTY5IDAw\r\nMDAwIG4gCjAwMDAwMDE2MjIgMDAwMDAgbiAKMDAwMDAwMTY1NCAwMDAwMCBuIAowMDAwMDAxNzEy\r\nIDAwMDAwIG4gCnRyYWlsZXIKPDwvUm9vdCAxMSAwIFIvSUQgWzxlMzM3ZTY1OTM0ZGJmNGM2ODRh\r\nZDI3OTk5NWExODNmMD48ZTMzN2U2NTkzNGRiZjRjNjg0YWQyNzk5OTVhMTgzZjA+XS9JbmZvIDEy\r\nIDAgUi9TaXplIDEzPj4Kc3RhcnR4cmVmCjE5MDYKJSVFT0YK",
"fileName": "贷款一次性结清证明打印",
"upperCase": "pdf"
},
"success": "true",
"time": 250980
}

 

现在拿到文件的字节流了

新建一个HTML文件 

<html>

  <head></head>

  <body>

  //这里的file即上面接受的file的值

  //这里要注意三点:

    1.使用时需要添加“data:application/pdf;base64” 表明file文件格式

    2.使用字符串替换,去除'\r\n'(换行符),这个会影响到前端对base64的解析(IE下影响最大);

    3.使用字符串替换,在base64中有码值‘+',需要替换成‘%2B’(在JAVA8中会自动处理为'_')

    <iframe src="data:application/pdf;base64,file">

    </iframe>

<img src ="data:application/pdf;base64,JVBERi0xLjQKJeLjz9MKNCAwIG9iaiA8PC9MZW5ndGggNjU2L0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFtCnicrVbPaxNBGF0FFfbsqZfMSaPgOr9n10MFRYUi26aJFEmqkLaJmMRDjcRQKPYooaVePAo9i+A5N/EPEPEv8FAQL4IecpL6fbtrjWJ2s7th2JlZZmfe+94382Y5WbCvVWxGKBSsXclJpWNfvskIg17DLl6oPLRvjH9CyVpnfBLTLjEed7QIZ3LCXJxJg/HNpl1cXKxfLbX731589C/6w13Tmt/+9OjU/lzvsHwHl6ek+R+I6iq06zYHiv+MzP7DsXCUINp4DnWPo5F/R7NUaM37wyy8x1C4qxyVALT32v85eFcePT2REwxCUp4bg7RSK949X+pWn9dqb1Zo+UqYrK2D7mn/0v33T8RghIn7k0ZMYV5OnCgVxwkxmoWXSzlxmHETgJqFo1pj52tOHKFMUkC9nR8zSCQzMRiP3w4Ot86idKvf/b28e9R4CXClB/tf8CjTk3mzRD0ipXCMmQS12W+to2PkhuKeJsLIGKjtDxbBsvwqbP3h0Vze+ABDG+14E6V89tlvtN3JMBTsogdjC9Gc5Vu/kaO1ScfmWgS9tl2ectPqJA+ymCUsHjwK+p5loMZC4ZFQhGWykA6RkbSSNB1pNGgRxxm3/+658mgWOYsFAhGUpUEIDoUGRQZ1KI1n0cz5FMfSiBTSSCkTnH7ttn+mdH2jm4WYpLi6iohhb2piTGhHJPgjaGgsnVUxpZBY6PYpiCnmJdBq1XNbjqQa/44Sw6d4yu51oXWbtTq8sI3DTIfLdSM9wvBS6MGlcthUVIHsDKhyriOqQqVMHTM0UDX2hoqoaqAKroVUwbqyUWUKr0OJPgt2hb00PotU8adv8rUTUGWWG6hqQlV1HNXprzs4fZNxqwf1/tRX3C+tO4RgCmVuZHN0cmVhbQplbmRvYmoKMSAwIG9iajw8L1BhcmVudCA1IDAgUi9Db250ZW50cyA0IDAgUi9UeXBlL1BhZ2UvUmVzb3VyY2VzPDwvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0vRm9udDw8L0YxIDIgMCBSL0YyIDMgMCBSPj4+Pi9NZWRpYUJveFswIDAgNTk1IDg0Ml0+PgplbmRvYmoKNiAwIG9ialsxIDAgUi9YWVogMCA4NTQgMF0KZW5kb2JqCjIgMCBvYmo8PC9CYXNlRm9udC9IZWx2ZXRpY2EvVHlwZS9Gb250L0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9TdWJ0eXBlL1R5cGUxPj4KZW5kb2JqCjcgMCBvYmo8PC9Gb250QkJveCBbLTI1IC0yNTQgMTAwMCA4ODBdL0NhcEhlaWdodCA4ODAvU3R5bGU8PC9QYW5vc2UoAQUCAgQAAAAAAAAAKT4+L1R5cGUvRm9udERlc2NyaXB0b3IvU3RlbVYgOTMvRGVzY2VudCAtMTIwL0ZsYWdzIDYvRm9udE5hbWUvU1RTb25nLUxpZ2h0L0FzY2VudCA4ODAvSXRhbGljQW5nbGUgMD4+CmVuZG9iago4IDAgb2JqPDwvQmFzZUZvbnQvU1RTb25nLUxpZ2h0L0NJRFN5c3RlbUluZm88PC9PcmRlcmluZyhHQjEpL1JlZ2lzdHJ5KEFkb2JlKS9TdXBwbGVtZW50IDQ+Pi9XIFsxWzIwN10xNyAyNiA0NjJdL1R5cGUvRm9udC9TdWJ0eXBlL0NJREZvbnRUeXBlMC9Gb250RGVzY3JpcHRvciA3IDAgUi9EVyAxMDAwPj4KZW5kb2JqCjMgMCBvYmo8PC9EZXNjZW5kYW50Rm9udHNbOCAwIFJdL0Jhc2VGb250L1NUU29uZy1MaWdodC1VbmlHQi1VQ1MyLUgvVHlwZS9Gb250L0VuY29kaW5nL1VuaUdCLVVDUzItSC9TdWJ0eXBlL1R5cGUwPj4KZW5kb2JqCjUgMCBvYmo8PC9UeXBlL1BhZ2VzL0NvdW50IDEvS2lkc1sxIDAgUl0+PgplbmRvYmoKOSAwIG9iajw8L05hbWVzWyhKUl9QQUdFX0FOQ0hPUl8wXzEpIDYgMCBSXT4+CmVuZG9iagoxMCAwIG9iajw8L0Rlc3RzIDkgMCBSPj4KZW5kb2JqCjExIDAgb2JqPDwvTmFtZXMgMTAgMCBSL1R5cGUvQ2F0YWxvZy9QYWdlcyA1IDAgUj4+CmVuZG9iagoxMiAwIG9iajw8L0NyZWF0b3IoSmFzcGVyUmVwb3J0cyBcKHBheU9mZkRhdGFcKSkvUHJvZHVjZXIoaVRleHQxLjMuMSBieSBsb3dhZ2llLmNvbSBcKGJhc2VkIG9uIGl0ZXh0LXBhdWxvLTE1NFwpKS9Nb2REYXRlKEQ6MjAxODA3MjYxMDQ0NTcrMDgnMDAnKS9DcmVhdGlvbkRhdGUoRDoyMDE4MDcyNjEwNDQ1NyswOCcwMCcpPj4KZW5kb2JqCnhyZWYKMCAxMwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDA3MzggMDAwMDAgbiAKMDAwMDAwMDkzNyAwMDAwMCBuIAowMDAwMDAxMzk2IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMTUxOSAwMDAwMCBuIAowMDAwMDAwOTAzIDAwMDAwIG4gCjAwMDAwMDEwMjQgMDAwMDAgbiAKMDAwMDAwMTIxNCAwMDAwMCBuIAowMDAwMDAxNTY5IDAwMDAwIG4gCjAwMDAwMDE2MjIgMDAwMDAgbiAKMDAwMDAwMTY1NCAwMDAwMCBuIAowMDAwMDAxNzEyIDAwMDAwIG4gCnRyYWlsZXIKPDwvUm9vdCAxMSAwIFIvSUQgWzxlMzM3ZTY1OTM0ZGJmNGM2ODRhZDI3OTk5NWExODNmMD48ZTMzN2U2NTkzNGRiZjRjNjg0YWQyNzk5OTVhMTgzZjA+XS9JbmZvIDEyIDAgUi9TaXplIDEzPj4Kc3RhcnR4cmVmCjE5MDYKJSVFT0YK">

  </body>

</html>

HTML显示如下:

 

 

 

 右键图片img在新标签页打开

 

 

注意前台拿到base64格式字节流后需要做以下处理

1.前端拿到了服务端的base64流字符串,要怎么处理呢,如果直接使用的话,那怕是要反水水,因为,ta真的只是字符串~,这时候我们需要对字符串处理一下,给ta加上数据类型:"data:application/pdf;base64,",指明ta是什么类型的数据。

2.

 

 

流程:

在工作中遇到了在线预览PDF的需求,因为服务端的特殊原因,我选择了将pdf文件转为了base64流传给前端,前端拿到base64流在线展示pdf。

base64是一种编码格式。该要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。由于几乎任何文件流都可以转成base64流(就是字符串啦),十分方便在网络传输,所以很受欢迎。

 

以JAVA代码为例,创建读入文件流,转成byte数组,然后对自己数组进行base64编码。(推荐使用JAVA8自带的BASE64处理,特好用)

这里注意一下,转化之后的base64文件大小通常要比原文件要大,会涉及到一些性能问题,这里不做更多阐述。

 

特别注意:

出于网络传输,以及对前端友好的目的。需要对得到的base64字符串要进行处理。

1.使用字符串替换,去除'\r\n'(换行符),这个会影响到前端对base64的解析(IE下影响最大);

2.使用字符串替换,在base64中有码值‘+',需要替换成‘%2B’(在JAVA8中会自动处理为'_')

 

前端拿到了服务端的base64流字符串,要怎么处理呢,如果直接使用的话,那怕是要反水水,因为,ta真的只是字符串~,这时候我们需要对字符串处理一下,给ta加上数据类型:"data:application/pdf;base64,",指明ta是什么类型的数据。

 

给数据添加类型后,接下来使用就简单了,直接将拼接的字符串复制给html标签的src属性即可。(这里提供embed标签和iframe标签,我在关联经验里有写到)

 

posted on 2018-07-26 11:32  丶柚子  阅读(1605)  评论(1编辑  收藏  举报

导航