動機
有些網頁服務,會要求使用者上傳文件,如課程大綱的摘要,有許多人會上傳 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);
沒有留言:
張貼留言