(PHP) libreoffice將WORD轉PDF
這是我第一次寫技術相關的貼文,因為這次的開發在轉檔這部分花了好多時間研究,查了很多的文件和論壇才成功轉檔,沒想到漏掉安裝一個小套件又花了好多時間查資料,所以覺得不寫起來當作筆記很可惜,也分享給和我發生一樣問題的人。
網路上有很多的套件可以直接產生WORD檔,也有能直接產生PDF的套件像是TCPDF的功能也很多,但因為格式上會需要比較彈性的調整在產生後達不到我要的效果,所以我選擇把WORD檔當作樣本再轉成PDF檔。
網路上有很多的套件可以直接產生WORD檔,也有能直接產生PDF的套件像是TCPDF的功能也很多,但因為格式上會需要比較彈性的調整在產生後達不到我要的效果,所以我選擇把WORD檔當作樣本再轉成PDF檔。
雖然WORD在匯出就有PDF的選項可以進行轉檔,可以手動進行操作,但我要將資料放在網路上提供登入系統的使用者下載,使用者下載時自動將資料轉成PDF檔。所以我的做法是將後端的資料存在資料庫中,轉出時將一份WORD公版檔案格式當作樣本,這裡我用PHPWord套件以這份樣本去複製產生一份新的檔案並將資料寫入Word檔,然後需再經過libreoffice轉檔才是我要的PDF檔,讓使用者下載,才完成所有的轉檔步驟。
我的作業系統為CentOS 7,在上面先安裝libreoffice,再來需要把相關的套件安裝上去這樣轉檔的功能才能真正使用。
套件清單:
libreoffice
libreoffice-headless
libreoffice-writer
libreoffice-calc
以下是我從官方文件和各類的技術論壇整理出來大概的重點和指令:
轉換指令:
soffice --headless --convert-to
pdf:writer_pdf_Export {要被轉的word檔} --outdir {輸出檔案的資料夾}
--headless
已無介面模式啟動,此模式禁用介面啟動應用程式。當系統不是在GUI模式下須加上此行指令,還有安裝libreoffice-headless套件,若無安裝會出現此錯誤訊息。
/usr/lib/libreoffice/program/soffice.bin
X11 error: Can't open display
這邊要注意,作業系統若沒有安裝GUI啟用libreoffice時就必須要安裝libreoffice-headless這個套件,否則轉檔會失敗。由於作業系統是沒有啟動GUI,我一開始只有安奘libreoffice少了libreoffice-headless和其他兩個套件所以出現了以下的錯誤訊息:
/usr/lib64/libreoffice/program/soffice.bin
X11 error: Can't open display:
Set DISPLAY environment variable, use -display option
or check permissions of your X-Server
(See "man X" resp. "man xhost" for details)
--convert-to {輸出檔案的副檔名} 將檔案轉成指定的格式,此處我是將word檔轉為pdf檔,因此這邊是打pdf,後面的:writer_pdf_Export命令為寫入轉換的例外處理
--outdir
{輸出檔案的資料夾}
指定輸出檔案的目的地,若無輸入--outdir 則輸出為目前工作目錄的資料夾
我是使用PHP提供轉檔下載,使用shell_exec去執行轉檔指令。注意,使用shell_exec函式將word轉為pdf檔,須再加上export HOME={PHP程式所在的工作目錄},否則程式執行系統不會動作。
完整指令:
shell_exec("export HOME={PHP程式所在的工作目錄} && soffice
--headless --convert-to pdf:writer_pdf_Export {要被轉的word檔} --outdir {輸出檔案的資料夾}")
參考網址:https://blog.51cto.com/dellinger/2091478
參考網址:https://blog.51cto.com/dellinger/2091478
留言
張貼留言