实现逻辑:后台将pdf文件转为base64编码传给前端,前端将base64转为pdf文件并生成路径,路径给iframe使用,这样打印的时候不会有跨域问题
前端代码:
<iframe id="downloadFrame" style="display:none;"></iframe>
//将base64编码转为blob文件
var data = window.atob(baseCode);
var len = data.length;
var arr = new Uint8Array(len);
for(let i = 0; i < len; ++i) {
arr[i] = data.charCodeAt(i);
}
var blob = new Blob([arr], {type: 'application/pdf'});
//创建文件的url
var blobURL = window.URL.createObjectURL(blob);
//将url路径赋给src
$('#downloadFrame').attr('src',blobURL);
//加载完成后打印
$('#downloadFrame').load(function() {
console.log('print')
var PDF = document.getElementById('downloadFrame');
PDF.focus();
PDF.contentWindow.print();
});
后端代码:
// 获取base64码
@param src 文件路径
@SuppressWarnings("deprecation")
public static String getBase(String src){
InputStream in = null;
try{
if(src == null || src == ""){
return "";
}
File file = new File(src);
if(!file.exists()){
return "";
}
in = new FileInputStream(file);
int cnt = in.available();
if(cnt != -1){
byte[] data = new byte[cnt];
in.read(data);
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
}catch(FileNotFoundException e){
logger.error("FileNotFound", e);
}catch(IOException e){
logger.error("失败!", e);
}finally{
IoCloseUtil.closeInputStream(in);
}
return null;
}