標籤:
displaytag無法匯出pdf、rtf?????? 已解決
因為做畢業設計的需要,所以從今天開始需要考慮分頁處理的問題,一開始是在網上尋找可用的開源架構予以借鑒使用,於是在
經過查閱網上的許多文章資料後,我將目標鎖定到了display tag上,關於display tag的用法,主要集中在幾個方面:分頁(含
記憶體分頁與資料庫分頁)、對列排序、匯出資料。
網上的相關資料確實很多,但是很多轉載的文章大同小異的也很多。於是就為一些問題埋下了伏筆。
我按照網上的大部分說法,匯入了相關包:
displaytag-1.2.jar
commons-lang-2.6.jar
standard.jar
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
iText-5.0.6.jar
jstl.jar
displaytag-export-poi-1.2.jar
displaytag-portlet-1.2.jar
而且還弄了個簡單的執行個體想測試一下分頁和匯出功能。但是卻發現怎麼也無法匯出pdf與rtf格式的資料(更準確的說法是頁面上
只顯示了csv、xml、excel的label或按鈕,但是卻沒有顯示pdf、rtf的label或按鈕,故無法使用匯出功能!而且在netbeans的輸
出欄內,tomcat日誌、伺服器日誌、程式輸出均無提示異常!)。我的資料裡面並無涉及中文。百思不得其解,在網上也沒找到
合理的或相關的解釋,看來看去,都是在說中文問題!
於是無奈之中,匯入了iTextAsian.jar,但是發現問題依舊。
糾結之中,又檢查起了web.xml的配置,發現已經正確配置,否則,它應該會拋出異常。而且我在預設包下的
displaytag.properties檔案也將相應的property set為true了,那麼問題出在哪呢?
我配置如下:
#sort.behavior=list
#sort.amount=list
#basic.empty.showtable=true
#basic.msg.empty_list=No results matched your criteria.
#paging.banner.placement=top
#paging.banner.onepage=<span class="pagelinks"></span>
export.types=csv excel xml pdf rtf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.rtf=true
export.excel.class=org.displaytag.export.excel.DefaultHssfExportView
export.pdf.class=org.displaytag.export.DefaultPdfExportView
export.rtf.class=org.displaytag.export.DefaultRtfExportView
paging.banner.placement=bottom
# if set, file is downloaded instead of opened in the browser window
#export.[mymedia].filename=
為什麼不行呢?
無奈之下,我只好開啟了displaytag-1.2.jar內的org.displaytag.properties裡的displaytag.properties檔案,想將內容複寫
到我建立的屬性檔案中去。部署項目後依舊有問題。
最後迫於無奈,檢查相關export用到的class,即org.displaytag.export.excel.DefaultHssfExportView、
org.displaytag.export.DefaultPdfExportView、org.displaytag.export.DefaultRtfExportView等。
終於發現部分類內居然有些匯入類缺失!原來還是缺包!不得不佩服,網上那些轉載文章的,轉載了,卻不去測試,結果“以訛
傳訛”。
幾經周折,我終於發現還缺一個包,那就是itext-1.3.1.jar!!!!!!!!我在csdn裡能找到相關的下載!!!!
下載地方:http://download.csdn.net/source/2819666
補上包後,發現netbeans裡面對相關匯入還是顯示紅色,但是仔細檢查,確實已經匯入了!部署後發現csv excel xml pdf rtf五
種格式均可匯出!
(後經檢查,發現itext包與iText包是等效的,提示缺包,可能是tomcat本身的bug,換了個glassfish後就沒提示了。。。)
另外附上,其他有用的網址:
http://sourceforge.net/projects/itext/files/
http://sourceforge.net/projects/itext/files/extrajars/ExtraJars1.0/
http://sourceforge.net/projects/itext/files/extrajars/ExtraJars1.0/iTextAsian.jar/download
後記:當時弄的時候搞到比較晚,所以沒進一步往下操作,後來點選連結後發現excel連結會出錯,拋出異常如下:
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError:
org/apache/poi/hssf/usermodel/HSSFWorkbook
經檢查,發現還需要匯入poi-3.7-20101029.jar。於是匯入。
匯入後發覺問題依舊,覺得很是奇怪。
我是在項目源包內的預設包下重建立的displaytag.properties檔案,這個也是參考自網上的做法。我們知道在項目的匯入包
displaytag-1.2.jar中還存在著一個更全的properties檔案,而根據先前我在網上搜到的某個例子,當中在建立的屬性檔案中是
沒有這句的:export.excel.class=org.displaytag.export.excel.DefaultHssfExportView
雖然我覺得加了或沒加都一樣(因為在那個更全的屬性檔案中也是存在這個的)。最後試來試去,還是得改為原先那個比較少內
容的屬性檔案,換成用比較全的那個會出錯,具體原因不知道。
我的屬性檔案是這樣寫的:
#sort.behavior=list
#sort.amount=list
#basic.empty.showtable=true
#basic.msg.empty_list=No results matched your criteria.
#paging.banner.placement=top
#paging.banner.onepage=<span class="pagelinks"></span>
export.types=csv excel xml pdf rtf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.rtf=true
export.excel.filename=page.xls
export.csv.filename=page.csv
export.pdf.filename=page.pdf
export.rtf.filename=page.rtf
export.pdf.class=org.displaytag.export.DefaultPdfExportView
export.rtf.class=org.displaytag.export.DefaultRtfExportView
paging.banner.placement=bottom
# if set, file is downloaded instead of opened in the browser window
#export.[mymedia].filename=
但是在我的印象中,上次那樣用好像是沒問題的,另外pdf直接在瀏覽器上開啟也會出問題,癥狀是網頁標籤自動關閉了(我用的
是360瀏覽器)。必須設定export.pdf.filename=XXX,以瀏覽器下載的方式開啟。。。。。
無奈,想起今天下午剛剛更新過360瀏覽器與adobe reader(碰巧同一天)。。。。。。哪裡出了問題呢?鬼才知道。。。。
後記:
之前的研究沒有考慮中文,後來我研究了一下,發現原本用來開啟excel的類是
org.displaytag.export.excel.ExcelHssfView,於是我將設定檔中的內容改回原樣:
export.excel.class=org.displaytag.export.excel.ExcelHssfView
這樣就能在excel中正確顯示中文了。
說到這裡,由於是研究輸出中文亂碼的問題嘛,所以有必要指出,我在這裡參考了某篇文章,來源:普索網
以下是節選內容:
“
列出displaytag 1.2版中文PDF與Excel中文亂碼解決方案:
Excel亂碼部分(使用poi-3.2-FINAL-20081019.jar)//注意版本,否則可能提示缺少部分方法。。。。
1.請下載displaytag-export-poi-1.2.jar
2.在displaytag.properties加入export.excel.class=org.displaytag.export.excel.ExcelHssfView
PDF中文消失部分(使用iText 2.1.5)
1.請下載 iTextAsian.jar
2.請下載displaytag 1.2的source code
3.自行複製org.displaytag.export裡的PdfView.java於自訂的package
4.於initTable()中修改
1
smallFont = FontFactory.getFont(FontFactory.HELVETICA, 7, Font.NORMAL, new Color(0, 0, 0))
變成
1
smallFont = FontFactory.getFont("MHei-Medium", "UniCNS-UCS2-H", Font.DEFAULTSIZE);
5.在displaytag.properties加入export.pdf.class=com.kymco.displaytag.export.PdfView,其中
com.kymco.displaytag.export應改成您自己的package
”
對於上面這段話,很有借鑒意義,但是在實際使用過程中,還是遇到了問題,對於其中的“使用iText 2.1.5”,本人實踐證明這
樣不行,需要更舊的包,否則會拋出異常:org.apache.jasper.JasperException: javax.servlet.ServletException:
java.lang.NoSuchMethodError: com.lowagie.text.Table.setDefaultVerticalAlignment(I)V。
至於解決辦法,參見這段摘自網上的話:
“
Export to PDF uses deprecated iText method
Export Application server: Apache Tomcat 6
Description: Hide Export to PDF throws
java.lang.NoSuchMethodError: com.lowagie.text.Table.setDefaultVerticalAlignment(I)V
This is a deprecated method (since iText 2.1 I think), and (Captain Obvious) it does not work with iText 5.0.1
that
”
從以上這段話我們可以得出幾點結論:
一、我們之前使用的itext-1.3.1.jar很顯然是舊包,而iText-5.0.6.jar是新包,而且字母t一個是大寫,一個是小寫。顯然
displaytag需要用的是舊包,新包沒用到。
二、要知道displaytag與itext分屬兩個架構,開發人員不同,所以很顯然,他們的更新速度不同步。造成我們還需要用舊包。
另外還有一個異常:org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoSuchMethodError:
com.lowagie.text.Rectangle.width()F
但是就算我用了最舊的包,也發現異常依舊。。。徹底無語了。。。
而且之前的就算是英文,匯出也有問題了。早知道這樣就先做好備份啦。。。
最後最後,我重建立了一個項目,按部就班,一步一步做備份後,發現並不應該拋出那些異常,看來問題是源於netbeans本身的
錯誤,估計是緩衝,還是內部設定檔什麼的記錄出錯了。
哎~~~~~~~記得以前遭遇過類似情況沒想到這次又遇上了。。。。。。看來netbeans靠不住啊。。。。
經過我仔細檢查後發現,displaytag1.2與iText5並不完全相容,也就是說,一旦你想修改displaytag裡面的類時,經常會遇到找
不到類的情況。當然直接用iText5.0.6,而不為瞭解決因匯出資料中含有中文而出現的問題時,直接用iText5.0.6並無大礙。
只是按照網上的做法,始終無法解決csv、pdf的中文顯示問題。excel倒是能通過設定:
export.excel.class=org.displaytag.export.excel.ExcelHssfView來解決。rtf本身就能正常匯出。xml本身就能顯示正常。
於是乎,問題就是csv亂碼,pdf中文顯示為空白了。
接著,附上我的屬性配置:
#sort.behavior=list
#sort.amount=list
#basic.empty.showtable=true
#basic.msg.empty_list=No results matched your criteria.
#paging.banner.placement=top
#paging.banner.onepage=<span class="pagelinks"></span>
export.types=csv excel xml pdf rtf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.rtf=true
export.excel.filename=page.xls
export.csv.filename=page.csv
export.pdf.filename=page.pdf
export.rtf.filename=page.rtf
export.excel.class=org.displaytag.export.excel.ExcelHssfView
export.pdf.class=testList.PdfViewSupportAsian
export.rtf.class=org.displaytag.export.DefaultRtfExportView
paging.banner.placement=bottom
# if set, file is downloaded instead of opened in the browser window
#export.[mymedia].filename=
其中testList.PdfViewSupportAsian是修改過org.displaytag.export.PdfView而做成的。
使用時要求itext版本不能為5或以上。但是依舊無法解決中文顯示為空白的問題。
我設了的displayTag庫內容為:
displaytag-1.2.jar
commons-lang-2.6.jar
standard.jar
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
itext-2.1.5.jar
jstl.jar
displaytag-export-poi-1.2.jar
displaytag-portlet-1.2.jar
poi-3.2-FINAL-20081019.jar
iTextAsian.jar
最後最後,我在想:是不是應該嘗試一下使用iText5?因為或許它已經支援了中文,utf8呢????但是這樣就需要找到我的解
決之道才行,不能照搬別人的方案了。
……………………………………………………
杯具。。。。。。。。。。
後記:
對於以上問題,我有了新的解答,大家看我的另一篇文章:《displaytag 中文問題 探索日誌 注釋》
後記:
關於pdf輸出中文為空白的問題,已經得到瞭解決。
可以參見我的另一篇文章,《displaytag 國際化 探索日誌 注釋》,是因為我沒有正確配置屬性檔案的問題。系統預設的locale
是zh_CN,而我在配置時只留意了displaytag.properties,沒仔細檢查displaytag_zh_CN.properties,那裡由於我之前編寫項目
時遺留問題的關係,所以沒編寫正確,所以導致了問題。
後來我改正了問題之後,參見《displaytag 國際化 探索日誌 注釋》,我於是重試了一下《來源普索網 displaytag的export功
能中文出現亂碼...》中提到的方法,發現我寫的testList.PdfViewSupportAsian其效果了。
但是,這期間有幾點需要留意:參見我在頁面中的注釋:
<%--居然可以輸出pdf了,不過是在adobe9更新後,而且字型不大好看,有什麼改進意見嗎?
回想原先點匯出pdf時,提示的是伺服器沒響應。
而剛才因為訪問錯了連結名稱,所以導致頁面沒顯示“匯出pdf”按鈕,這一點以後須留意。--%>
即,一開始我寫錯了地址欄的連結名稱,後來改正了,於是可以訪問了。而回想最初時,一直是提示伺服器沒響應的,不知道是
不是因為我之前可能配錯了屬性檔案的緣故,現在已經無從追查,因為我做的這個不是主要項目,所以沒有經常備份。
另外,那個字型不好看。而且其間adobe reader 9提示了更新中文字型庫。。。
所以之前伺服器無法響應的問題是因為配置問題,還是字型不支援問題,就無從追查了。
最後,那個字型好難看,換成什麼才好呢?
後記:
我在網上搜到了一篇文章:《Itext中文處理pdf(轉)》,按照它的提示,我將字型改為了宋體,好看多了。
具體的改法可以參見我空間中的《Itext中文處理pdf(轉)(改)》
收藏於 2011-03-02
displaytag無法匯出pdf、rtf?????? 已解決