2022年7月21日 星期四

使用 LibreOffice 將 doc 或 ppt 轉換成 pdf

動機

有些網頁服務,會要求使用者上傳文件,如課程大綱的摘要,有許多人會上傳 word 檔,在網頁無法直接預覽其上傳的內容。要在網頁預覽,必須將其轉換成 pdf 比較方便。Openoffice 有一種 headless 的執行模式,可用 PHP 來呼叫,於線上完成轉檔。

作法

本以為 Openoffice 都有這功能,我的電腦原來是裝 Apache Openoffice 4.1,在 cmd 視窗都輸入指令,都會開啟視窗。後來確認 Apache Openoffice 4.1 無法使用 headless 模式轉換 pdf。移除後,改裝 LibreOffice 7.3 即可成功執行。

使用命令視窗來測試

c:\Program Files\LibreOffice\program>soffice.com --headless --convert-to pdf c:\temp\test.doc --outdir c:\temp
convert C:\temp\test.doc -> c:\temp\test.pdf using filter : writer_pdf_Export
Overwriting: c:\temp\test.pdf

大約等 10 秒,順利完成轉檔。

透過 PHP 來執行轉檔

$soffice_cmd = 'c:\Program Files (x86)\LibreOffice\program\soffice.com';

$conv_cmd = "\"{$soffice_cmd}\" --headless --convert-to pdf c:/temp/test.dot --outdir c:/temp ";
        
echo "轉成PDF檔案: $conv_cmd<br>\n";
$exec_flg = exec($conv_cmd, $res_out, $res_code);

var_dump($exec_flg);
var_dump($res_out);
var_dump($res_code);

從瀏覽器執行,會等很久,超過執行時間而失敗。

在命令視窗,直接用 PHP 執行該 script 檔,則能順利執行。

從 Google 找答案,大約就是權限問題,因為透過 IIS 執行,其 home 目錄不曉得是那裡,LibreOffice 無法建立暫存檔,就掛在那邊。解決辦法是指定 -env 參數。

修正後的程式如下

$soffice_cmd = 'c:\Program Files (x86)\LibreOffice\program\soffice.com';

$conv_cmd = "\"{$soffice_cmd}\" -env:UserInstallation=file:///c:/temp --headless --convert-to pdf c:/temp/test.dot --outdir c:/temp ";
        
echo "轉檔指令: $conv_cmd<br>\n";
$exec_flg = exec($conv_cmd, $res_out, $res_code);

var_dump($exec_flg);
var_dump($res_out);
var_dump($res_code);

請注意,目錄的格式是URL的形式。

至於 Linux 下,則是指定 HOME 參數

$conv_cmd = "export HOME=/tmp && soffice --headless --convert-to pdf ".$doc_path." --outdir /tmp/";
echo "轉檔指令: $conv_cmd<br>\n";
exec($Linux_command);




沒有留言:

張貼留言

網誌存檔