1. 概述编辑
本文介绍 打印 时遇到的问题及解决方案。
2. 内置打印功能常见问题编辑
2.1 打印软件不生效
问题描述
升级至 2020-04-26 之后的 JAR 包,打印软件不生效。
原因分析
一般是由于打印软件版本过低,使用 打印 文档中 3.3.1 节提供的 FinePrint V5 版本即可。
2.2 本地打印软件启动失败
问题描述
选择「本地软件打印」时,提示本地打印软件启动失败,如下图所示:
解决方案
点击提示中的「下载安装」,下载并启动本地打印软件。并注意以下几点:
1)本地打印不要安装在设计器的安装目录下。
2)若已安装好本地打印软件,提示启动失败,请检查 9092 端口是否被占用。
3)若机器性能较差,会导致首次启动消耗时间较长。出现以上报错时请耐心等待,或稍后再次尝试打印。
2.3 浏览器不兼容
问题描述
目前浏览器打印预览不兼容 IE10 及以下版本,不兼容时打印预览右侧 iframe 提示「此浏览器暂不支持打印预览」,如下图所示:
注:IE11 有些小版本可能不兼容,更换浏览器即可。
解决方案
在 IE 浏览器下进行打印时,需要启用管理加载项中的 Adobe PDF Reader 控件,否则提示「安装警告」或打印出来的文件名默认 ReportSerber,如下图所示:
2.4 自定义纸张打印不全
问题描述
当「模板>页面设置」中纸张大小为「自定义」时,本地软件打印的内容可能会显示不全。
原因分析
因为 Java 默认的打印,会从打印机纸张里寻找相近的纸张进行匹配。如果没有在打印软件中添加自定义纸张,可能找出来的是别的纸张。从而导致打印内容被截断。
解决方案
需要在打印软件中添加自定义纸张大小。具体设置请参见:Java 读取打印机自定义纸张
2.5 打印字体重叠
问题描述
用户是「零客户端打印」,打印后,字体重叠。
解决方案
3.调用打印常见问题编辑
3.1 invalid sheet index
问题描述
JS 调用打印,指定不弹出 sheet ,打印报错:invalid sheet index
代码如下:
/*单个模板打印*/
var printurl="http://localhost:8075/webroot/decision/view/report";
var reportlets ="[{reportlet: 'GettingStarted.cpt', 地区: '华北'}]";
var config = {
printUrl : printurl,
isPopUp : true,
// 是否弹出设置窗口,true为弹出,false为不弹出
data :{
reportlets: reportlets // 需要打印的模版列表
},
printType : 1, // 打印类型,0为零客户端打印,1为本地打印
// 以下为零客户端打印的参数,仅当 printType 为 0 时生效
ieQuietPrint : true,// IE静默打印设置 true为静默,false为不静默
// 以下为本地打印的参数,仅当 printType 为 1 时生效
//printerName : '', // 打印机名
isSheetSelectPopUp:false,
pageType: 1, // 打印页码类型:0:所有页,1:当前页,2:指定页
pageIndex: 2, // 页码范围。当 pageType 为 2 时有效
copy: 2, // 打印份数
};
FR.doURLPrint(config);
解决方案
config 代码中需要指定 sheetIndex 。sheetIndex 介绍请参见:JS 调用 FR 打印方法
注:isSheetSelectPopUp 参数介绍请参见 JS 调用 FR 打印方法
3.2 报错 404
问题描述
Tomcat 上调用 FR 工程的本地打印,如果 Tomcat 上无 FR 工程,下面这个请求报错 404,如下图所示:
注:该问题在 Finereport 10.0 和 Finereport 9.0 中都会出现。
原因分析
执行 FineReport.js 的时候,会尝试从本服务器上加载资源,而调用者的服务器上,没有报表工程,加载不到资源,所以报错。
解决方案
在跨域调用新打印时,需要额外引入两个 js,分别是 socket.io.js 和 jquery.watermark.js (引入位置在 FineReport.js 后面),示例代码如下所示:
注:Tomcat 下不能有报表工程。
1)10.0 示例
<script type="text/javascript"
src="http://localhost:8075/webroot/decision/view/report?op=resource&resource=/com/fr/web/core/js/socket.io.js"></script>
<script type="text/javascript"
src="http://localhost:8075/webroot/decision/view/report?op=resource&resource=/com/fr/web/core/js/jquery.watermark.js"></script>
2)9.0 示例
<script type="text/javascript"
src="http://localhost:8075/WebReport/ReportServer?op=resource&resource=/com/fr/web/core/js/socket.io.js"></script>
<script type="text/javascript"
src="http://localhost:8075/WebReport/ReportServer?op=resource&resource=/com/fr/web/core/js/jquery.watermark.js"></script>
3.3 一直显示正在加载控件
问题描述
在页面中调用 finereport.js 下的 FR.doURLPDFPrint(url) 时,会一直显示"正在打印 正在加载控件...",如下图所示:
您引用的 finereport.js 和页面不在同一个应用下,如您的 Web 工程名为 FR,而您调用 finereport.js 的语句是:
<script type="text/javascript" src="http://localhost:8075/webroot/decision/view/report?op=emb&resource=finereport.js"></script>
这就涉及到跨域访问js,从而出现如上情况。
解决方案
1)若您应用为 Java 应用,且页面没有通过 iframe 嵌入报表,而是希望不预览模板直接打印或者批量打印报表,则可以采用如下方案:
将报表应用 嵌入式部署 到 Java 应用中,修改调用 finereport.js 语句,使用相对路径引用 JS,如修改后的调用 finereport.js 的语句为:
<script type="text/javascript" src="/工程名/decision/view/report?op=emb&resource=finereport.js"></script>
2)若您页面通过 iframe 嵌入了报表,希望打印该报表,则可以采用如下方案(Java/非 Java 应用都可以,可以为独立的报表应用):
不调用 finereport.js 下的FR.doURLPDFPrint(url)进行打印,而是获取 iframe 中的报表直接打印,即使用 iframe 解决跨域问题。
假设 iframe 的 id 是 reportFrame,则打印方法如下:
function doprint(){
document.getElementById('reportFrame').contentWindow.contentPane.pdfPrint();
}
3.4 缺少相关文件
问题描述
使用 JS 调用 FineReport 打印方法时,有如下报错:
Access to XMLHttpRequest at 'file:///F:/webroot/decision/view/report?op=resource&resource=/com/fr/web/core/js/socket.io.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https
原因分析
经控制台查看发现是缺少相关文件:
解决方案
缺少文件,补齐即可,在html中做如下引用:
<script type="text/javascript" src="http://localhost:8075/webroot/decision/view/report?op=resource&resource=/com/fr/web/core/js/socket.io.js"></script> <script type="text/javascript" src="http://localhost:8075/webroot/decision/view/report?op=resource&resource=/com/fr/web/core/js/jquery.watermark.js"></script>