透過 Liber Office 將 WORD 轉成 PDF

 過去在執行專案的時候,客戶提了一個需求,需要把資料匯出成 WORD 和 PDF 檔案,由於要處理的畫面不少,又不想要針對 WORD、PDF 檔案各別花費不等的時間逐一處理,最終找到了 WORD 轉 PDF 的方案。

只需要處理好 WORD 資料的匯出,然後再透過 LiberOffice 協助將 WORD 轉換成 PDF,就可以滿足大致上的需求。

Liber Office Logo

  1. 安裝 LiberOffice

    由於要使用 Liber Office 來協助轉檔,所以安裝 Liber Office 是必須的。

  2. LiberOffice SDK

    由於我是使用 ProsessStartInfo 的方式呼叫 soffice.exe 來協助做轉檔,所以應該就不需要把 SDK 的檔案複製到專案底下。

  3. 執行轉檔

    我是使用呼叫外部程式的方式來執行,大致上的方法如下
    ProcessStartInfo procStartInfo = new ProcessStartInfo(libreOfficePath, $"--convert-to pdf --outdir {outPutPath} --nologo {officePath}");
    procStartInfo.RedirectStandardOutput = true;
    procStartInfo.UseShellExecute = false;
    procStartInfo.CreateNoWindow = true;
    procStartInfo.WorkingDirectory = Environment.CurrentDirectory;
    
    Process process = new Process() { StartInfo = procStartInfo, };
    process.Start();
    process.WaitForExit();

  4. IIS設定

    使用上述的方式呼叫外部程式轉檔,在開發環境上測試沒有問題,但是將程式佈署到 IIS 上後,就會發現網頁沒有回應,如果觀看工作管理員,就會發現到 soffice.exe 持續在執行,沒有任何停下來的跡象。

    會有這樣的狀況可能是權限的問題,目前我的處理方式是調整應用程式集區,將識別設定為 LocalSystem 後,就可以呼叫 LiberOffice 轉換成 PDF 了。
           從 MSDN 上針對「識別」這個選項是這樣說明的
    • 本機系統:完全受信任的帳戶,擁有更高的權限,也有 存取網路資源。
    • 網路服務:限制的網站 或  受限制的服務帳戶通常用來執行 標準 、 最低權限的服務。此帳戶具有較少的權限比本機系統帳戶。此帳戶具有存取網路資源。
    • 本機服務:限制或有限的服務帳戶是與網路服務非常類似,也提供給執行 標準 、 最低權限的服務。這個帳戶沒有存取網路資源。
    • ApplicationPoolIdentity:,當您建立新的應用程式集區時,IIS 會建立新的應用程式集區名稱,並執行應用程式集區背景工作處理序,在 [這個帳戶] 下的虛擬帳戶。這也是最低權限帳戶。
    • 自訂帳戶:除了這些內建的帳戶,您也可以使用自訂的帳戶藉由指定使用者名稱和密碼。

    使用「本機系統」這樣的方式看來頗危險,但是目前嘗試使用網路服務、本機服務來試試看,並且把 OpenOffice 資料夾的權限設定這兩個帳號可以完全存取,但是這樣的測試之下還是會發生 soffice.exe 持續執行的狀況,所以目前就只能先這樣子吧,等到以後有空來試試看別種方式。

    Blogger Comment

0 意見: