名詞解釋:FOP
FOP:Apache? FOP (Formatting Objects Processor) is a print formatter driven by XSL formatting objects (XSL-FO) and an output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PS, PCL, AFP, XML (area tree representation), Print, AWT and PNG, and to a lesser extent, RTF and TXT. The primary output target is PDF.
在docx4j里面刘离,如果你想把WORD轉換成PDF室叉,目前是有兩種方式。一種就是docx4j提供的遠程SAS轉換服務硫惕,另外就是基于FOP實現(xiàn)的WML到FO結構的轉換茧痕。既然是映射,或多或少有些元素轉換是存在問題恼除。至少我目前碰到了幾個問題踪旷,它的FOP的實現(xiàn)還是需要優(yōu)化。
1 文檔中表格的寬度超過文檔的輸入?yún)^(qū)域豁辉。如圖
2 word的字體集到 pdf的字體集對應有問題令野,會存在某種字體庫未加載
3 在做轉換設置的時候,轉換配置失效
4 一些特殊字符字體轉換不成功
針對上面的四個問題徽级,我結合實際情況來說明气破,大部分我自己已經(jīng)解決。
第一個問題的原因:該word的默認為A4大胁颓馈(21厘米*29.7厘米)现使,但是主體的表格寬度超過了21厘米,達到25.1厘米旷痕。在轉換FOP的過程中,首個繪制筆觸是從文檔寬度開始的碳锈,這樣繪制的內(nèi)容會少掉圖片及印章的內(nèi)容。變通的解決辦法可以在轉換之前將文檔的寬度設置成合適的值欺抗。
其中,14230這個值是25.1厘米轉換之后的值售碳。這樣,完整的WORD內(nèi)容才會完全繪制。
第二個問題的原因:該word里面包含了方正小標宋簡體贸人,宋體竿屹,黑體,華文中宋等四種字體灸姊。其中華文中宋字體庫一直未加載到fontMapper之中,具體原因還未知秉溉。后來定位在AbstractExporter類的export方法中力惯,存在對設置的值進行重新設置(可能是BUG),我在export里面又再次重設才解決召嘶。
第三個問題的原因:這個是FOP的低層table對象轉換約束父晶,就是tablecell下面不能沒有子元素,不然就會拋出missingChildElementError
僅僅通過strict-configuration為false弄跌,不能解決這個約束的問題甲喝,理論上這個是屬于FO的結構體校驗問題。
第四個問題的原因:該文檔里面有選中的checkbox铛只,在WML里面就會有 <w:sym w:font="Wingdings 2" w:char="0052"/>埠胖,在轉換成PDF之后。如圖
重點關注紅框框的內(nèi)容淳玩,這里轉換失敗直撤,原因未知。在查閱了DOCX4J的論壇之后蜕着,https://www.docx4java.org/forums/pdf-output-f27/wingdings-and-pdf-conversion-t1902.html谋竖,但是這個幫助不大。目前想到是轉換成PDF之后承匣,再通過PDFBOX定位到0052的字符串蓖乘,將其替換成選中的框,希望下次能再帶來一次關于PDFBOX修改分享韧骗,這樣就相當于曲線救國嘉抒,完成了WORD到PDF的完美轉換。
附各類之間的轉換關系