1. 概述
本文介紹 列印 時遇到的問題、解決方案以及常見的排查思路。
2. 常見問題排查思路
常見列印問題以及排查思路如下圖所示:
2.1 列印失敗的排查思路
列印失敗的排查步驟如下:
1)確認列印軟體啟動是否成功:首先觀察電腦本地程式列印是否已經啟動,如果無說明沒有啟動成功
2)確認具體的現象
偶發出現還是必定出現,如果是首次啟動失敗,需要點選多次才能正常列印,一般是啟動逾時問題。
若是必定復現,首先保證檢查列印軟體是否存在多個版本互相沖突,並且保證列印軟體不要安裝在設計器目錄下
3)檢查埠占用情況:本地列印軟體預設API的 9092,若被佔用,可釋放相應的API或者修改本地列印軟體的埠號,另外本地列印軟體的配置檔案也要修改成一樣的埠,修改完儲存重啟。
4)檢查配置:若是https環境想要呼叫本地軟體,首先得配置好本地列印的https,可參考文檔 本機列印https配置說明,其次檢查配置檔案的httpsMode 選項,設為 true,則為 https 模式;設為 false,則為 http 模式。
5)檢查是否為瀏覽器限制問題或殺毒軟體的問題。
6)檢查插件和 JAR 包是否匹配。
7)查看 bin 目錄下的 debug.log 日誌查看報錯,進行具體分析。
2.2 列印慢的排查思路
1)排查範本問題:需要確定是個別範本列印慢還是所有範本列印都慢。
若個別範本列印慢:可以檢查範本的具體設定。比如:是否有過多的圖片插入,條碼轉換,儲存格形態設定多,資料量大,本身匯出pdf檔案就很大,可以嘗試優化具體的範本,或者加大記憶體設定。
若是所有範本都慢:可能是工程問題,可嘗試升級JAR包。
2)檢查是否是瀏覽器問題:單個瀏覽器呼叫列印慢,可升級瀏覽器或者重置瀏覽器的設定,IE瀏覽器可嘗試關閉相容性檢視表。
3)排查是否為網路因素導致的列印慢。
4)排查是否為殺毒軟體的問題。
2.3 列印偏移的排查思路
根據產生偏移的因素,可簡要分為外部和內部兩個因素,通常內部因素對單個範本較常見,外部因素通常對工程所有範本起效,如下圖所示:
3. 內建列印功能常見問題
3.1 列印軟體不生效
問題描述
升級後,列印軟體不生效。
原因分析
一般是由於列印軟體版本過低,使用 列印 文檔中 3.3.1 節提供的 FinePrint 版本即可。
3.2 本地列印軟體啟動失敗
問題描述
1)選擇「本地軟體列印」時,提示本地列印軟體啟動失敗,如下圖所示:
2)本地列印,提示本地列印軟體啟動失敗,但是fineprint進程在的,右下角也是有圖示的
解決方案
1)點選提示中的「下載安裝」,下載並啟動本地列印軟體。並注意以下幾點:
本地列印不要安裝在設計器的安裝目錄下。
若已安裝好本地列印軟體,提示啟動失敗,請檢查 9092 埠是否被佔用。
若機器效能較差,會導致首次啟動消耗時間較長。出現以上報錯時請耐心等待,或稍後再次嘗試列印。
2)檢查工程是 http 還是 https ,其次檢查配置檔案的httpsMode 選項,設為 true,則為 https 模式;設為 false,則為 http 模式。根據工程的配置修改即可,可參考文檔 本機列印https配置說明。
3.3 IE瀏覽器列印沒反應或者列印不跳轉視窗
問題描述
1)IE瀏覽器下點選列印按鈕沒有彈窗顯示。
2)IE瀏覽器點選列印卡在“正在載入PDF”然後無回应。
解決方案
1)安裝或者重裝Adobe Reader。
線上安裝Adobe Reader:https://get.adobe.com/cn/reader/
離線安裝Adobe Reader:https://get.adobe.com/cn/reader/enterprise/
2)取消相容檢視表設定。
3.4 自訂紙張列印不全
問題描述
當「範本>頁面設定」中紙張大小為「自訂」時,本地軟體列印的內容可能會顯示不全。
原因分析
因為 Java 預設列印,會從印表機紙張裏尋找相近的紙張進行匹配。如果沒有在列印軟體中新增自訂紙張,可能找出來的是別的紙張。進而導致列印內容被截斷。
解決方案
需要在列印軟體中新增自訂紙張大小。具體設定請參見:Java 讀取印表機自訂紙張
3.5 列印字體重疊
問題描述
使用者是「零用戶端列印」,列印後,字體重疊。
解決方案
伺服器缺失字體導致。詳情請參見:字型缺失檢測 或 伺服器安裝字體
3.6 Flash 列印不可用
問題描述
FineReport 獨創了 Flash 列印技術,可以精確分頁列印,連打都可以做到,非常的方便,完美解決了困擾報表行業十幾年的基於瀏覽器的列印問題。由於某些原因 Flash 列印沒法使用,下面詳細介紹無法使用的原因。
注1:10.0設計器和部署包使用的都是 openjdk,而使用 openjdk 無法啟動 flash 列印,但使用 Oracle/sun jdk 可以。
注2:flash 列印目前是已經被淘汰了的技術,很多瀏覽器都將不再支援 flash 列印,建議客戶使用零用戶端或本地列印。
解決方案
1)沒有安裝 Flash Player 插件:用戶端點選Flash列印會觸發 Flash Player 插件,透過列印插件把要列印的資料畫出來,再傳到印表機把資料就列印出來,因此瀏覽器必須安裝插件才可以進行列印。
2)當前版本沒有此功能:由於 Flash 列印是我們特有的進階功能,所以註冊的低版本可能沒有 Flash 列印功能,點選 Flash 列印彈出如下對話框時,說明您購買的版本中沒有此功能,如果您需要使用這個功能的話,您可以聯絡我們的商務。
3)使用 Chrome 瀏覽器自帶的列印插件:
一般來說,瀏覽器列印功能都是使用 NPAPI 方式,但是在 Chrome20 之後,Chrome 瀏覽器的列印方式預設是採用 PPAPI 的,將預設列印方式停用即可。在 URL 地址欄裏面輸入 chrome://plugins/,進入 Chrome 覽器插件設定頁面,將 Adobe Flash Player 插件裏的 Shockwave Flash 23.0 r0 System 停用即可,如下圖:
停用之後效果:
注1:如果開啟插件設定介面,沒有顯示上面的介面,而是顯示收縮頁面,則點選詳細資訊展開
注2:如果插件設定介面上沒有 NPAPI 插件,則說明瀏覽器中的 Flash 版本中不包含 NPAPI 插件,需要去 Adobe Flash Player 官網下載 Flash,安裝後重啟 Chrome 即可。
3.7 如何控制列印時有無水印
問題描述
列印到紙上時需要顯示水印,或者客戶列印報表的時候,希望根據自己情況選擇列印範本是否帶有水印
解決方案
請參考:如何控制列印時有無水印
3.8 正文的對齊設定,預覽列印時效果不一致
問題描述
設計器中已調整成對齊樣式,但是網頁預覽和列印預覽時,會出現較大的不一致現象,如下圖:
原因分析
目前只支援全角空格的前後端一致效果,半角空格不支援,但是輸入法預設就是半角。
解決方案
將所有半角空格更換為全角空格。
3.9 base64圖片列印顯示的很小
問題描述
base64 展示圖片並列印,預覽正常,列印的時候,圖片縮的很小。
解決方案
html 裏的單位改成 pt 即可。
3.10 火狐瀏覽器列印方向異常
問題描述
使用火狐瀏覽器列印,印表機設定為縱向,但是點選列印時,方向卻是橫向的。
解決方案
火狐瀏覽器建議使用 113 版本,或更換谷歌瀏覽器進行列印。
4. 呼叫列印方法常見問題
4.1 invalid sheet index
問題描述
JS 呼叫列印,指定不彈出 sheet ,列印報錯:invalid sheet index
程式碼如下:
解決方案
config 程式碼中需要指定 sheetIndex 。sheetIndex 介紹請參見:JS呼叫FR列印方法
注:isSheetSelectPopUp 參數介紹請參見 JS呼叫FR列印方法
4.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 範例
2)9.0 範例
4.3 一直顯示正在載入元件
問題描述
在頁面中呼叫 finereport.js 下的 FR.doURLPDFPrint(url) 時,會一直顯示"正在列印 正在載入元件...",如下圖所示:
您引用的 finereport.js 和頁面不在同一個應用下,如您的 Web 工程名為 FR,而您呼叫 finereport.js 的語句是:
這就涉及到跨域存取js,進而出現如上情況。
解決方案
1)若您應用為 Java 應用,且頁面沒有透過 iframe 嵌入報表,而是希望不預覽範本直接列印或者批量列印報表,則可以採用如下方案:
將報表應用 嵌入式部署 到 Java 應用中,修改呼叫 finereport.js 語句,使用相對路徑引用 JS,如修改後的呼叫 finereport.js 的語句為:
2)若您頁面透過 iframe 嵌入了報表,希望列印該報表,則可以採用如下方案(Java/非 Java 應用都可以,可以為獨立的報表應用):
不呼叫 finereport.js 下的FR.doURLPDFPrint(url)進行列印,而是獲取 iframe 中的報表直接列印,即使用 iframe 解決跨域問題。
假設 iframe 的 id 是 reportFrame,則列印方法如下:
4.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="<a href="http://localhost:8075/webroot/decision/view/report?op=resource&resource=/com/fr/web/core/js/jquery.watermark.js">