修复jeecg接口pdfPreviewIframe无法预览pdf问题
出现白屏的原因是:后端 pdfPreviewIframe 没有将传入的 url 参数传递给前端模板,且前端模板 pdfPreviewIframe.ftl 中硬编码了一个已失效的阿里云 OSS 地址,导致无法加载指定的文件。
1.修改pdfPreviewIframe.ftl
java
<#assign base=springMacroRequestContext.getContextUrl("")>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Cache-Control" content="no-store"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="0"/>
<title>PDF预览</title>
</head>
<body style="margin:0; padding:0; height:100%; overflow:hidden;">
<script type="text/javascript">
/**
* PDF 预览中转页面
* 支持自动通过 url 参数加载 PDF.js 查看器
*/
(function() {
var rawUrl = "${url!""}";
if (rawUrl) {
var finalUrl = rawUrl;
// 如果 url 不是以 http 开头,自动补全为系统定义的静态资源接口路径
if (finalUrl.indexOf("http") !== 0) {
// 如果是以 / 开头,说明是绝对路径但缺少域名
if (finalUrl.indexOf("/") === 0) {
finalUrl = window.location.protocol + "//" + window.location.host + finalUrl;
} else {
// 否则视为业务相对路径,补全为 /sys/common/static/ 接口地址
var serverBase = window.location.protocol + "//" + window.location.host + "${base}";
finalUrl = serverBase + "/sys/common/static/" + finalUrl;
}
}
// 拼接 PDF.js 标准查看器地址
var viewerPath = "${base}/generic/web/viewer.html?file=" + encodeURIComponent(finalUrl);
// 重定向到查看器页面
window.location.replace(viewerPath);
} else {
document.body.innerHTML = "<div style='text-align:center; margin-top:100px; font-family: sans-serif;'>" +
"<h3>未指定预览文件地址</h3>" +
"<p style='color:#666;'>请通过 ?url=xxx 参数传入文件路径</p>" +
"</div>";
}
})();
</script>
</body>
</html>
2.pdfPreviewIframe接口
java
/**
* @功能:pdf预览Iframe
* @param modelAndView
* @return
*/
@RequestMapping("/pdf/pdfPreviewIframe")
public ModelAndView pdfPreviewIframe(ModelAndView modelAndView, @RequestParam(name = "url", required = false) String url) {
modelAndView.addObject("url", url);
modelAndView.setViewName("pdfPreviewIframe");
return modelAndView;
}