一、功能說明與定義
把Xps轉成Pdf
二、產生背景
由於項目的需求有用到相關的技術,因此進行了研究與整理。
三、實現方式
由於項目上已經有了相關的功能和實現(用的是開源的PdfSharp實現的),但是存在一些問題,在此的基礎上我花了些時間進行了整理和研究,因此進行的整理和總結,下面將對三種實現方式進行簡單的說明。
- 存在的問題
問題一:基於PdfSharp的轉換工具都有一個問題,就是在Xps的總頁碼大於50頁時,把Xps轉成Pdf最多只能生成出50頁的Pdf,查看源碼都能發現原來轉換接口中有如下的代碼塊
#if DEBUG // stop at page... if (pageIndex == 50) break; #endif
如上,如果PdfSharp相關的代碼是Debug版本,則都會出現此問題,解決辦法就是找到相關的源碼生成一個Release版本就可以了。
問題二 :由於PdfSharp的轉換工具存在緩存機制,因此如果Xps轉換為Pdf是用在服務端進行轉換那么將導致服務器內存的不斷增長,最終將導致服務的崩潰。解決辦法就是推薦采用第三種 3、GhostXPS 進行轉換。
- 實現方式
以下將簡單的介紹三種Xps轉Pdf的實現。
1、XpsToPdf
GIT地址:https://github.com/XpsToPdf/XpsToPdf
Framework版本:默認是
<TargetFrameworks>net48</TargetFrameworks>
支持 framework4.7但是要額外引入如下程序集
由於引入的 System.IO.Packaging 包的最低framework版本支持的是4.7因此無法在往下降了,除非找到相應的源碼同步調整相應的framework版本。
此項目其實就是基於PdfSharp的實現,因此也存在Debug下編譯的dll最多只能轉出50頁PDF的問題,詳見 存在的問題。
2、PdfSharp.Xps
GIT地址:https://github.com/EbenZhang/PdfSharp.XPS
Framework版本:
默認是framework3.5的項目
此項目也是基於PdfSharp的實現,實現代碼基本與(1)中的一樣,這里不再重復闡述,由於對framework的版本要求更低,因此更能符合大部分項目的要求。
總結:(1),(2)實現都是基於PdfSharp的方式,因此都存在Debug下編譯的版本只能生成50頁PDF的問題,其次轉換出來的PDF通常都比較大,目測會大10倍左右,我測試的Xps是200多頁1.6M左右,生成后的Pdf是16-17M。
3、GhostXPS
GIT地址:https://github.com/nmanichev/GhostXPS
Framework版本:
默認是framework4.0的項目
實現原理是通過帶參啟動gxpswin64.exe程序把Xps轉成Pdf,通過此方式生成的Pdf大小通常是Xps大小的3倍左右。
以上就是我本次分享的全部內容,由於都是開源項目,項目里都有對項目使用的詳細介紹因此這里都是簡單的說明和引入。
如果大家還有其他更好的方式也歡迎大家踴躍分享。