一個以 FastAPI 建立、使用 LibreOffice 在無頭模式下執行文件轉檔的輕量服務。
目前支援上傳以下 Office 檔案並轉成 PDF:
.doc.docx.ppt.pptx
此專案適合用在:
- 文件預覽前的 PDF 轉檔流程
- 後端檔案處理服務
- 以 Docker 快速部署的內部轉檔 API
- 使用
FastAPI提供簡單 HTTP API - 透過
LibreOffice --headless執行文件轉 PDF - 使用
docker-compose快速啟動 - 內建
Nginx反向代理與上傳大小限制 - 轉檔完成後自動清理暫存檔案
.
├── app/
│ └── app.py
├── nginx/
│ └── nginx.conf
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
└── README.md
- Docker
- Docker Compose
docker compose up --build -d服務啟動後,對外入口為:
- API Base URL:
http://localhost:8080
用來檢查服務是否正常運作。
範例:
curl http://localhost:8080/health預期回應:
{"status":"ok"}上傳文件並回傳轉好的 PDF 檔案。
- Method:
POST - Content-Type:
multipart/form-data - 欄位名稱:
file
.doc.docx.ppt.pptx
curl -X POST "http://localhost:8080/convert" \
-F "file=@sample.docx" \
--output sample.pdf如果成功,回應內容會直接是 PDF 檔案串流。
常見錯誤狀況如下:
400 Bad Request: 上傳的副檔名不支援504 Gateway Timeout: LibreOffice 轉檔超時500 Internal Server Error: LibreOffice 執行失敗或 PDF 未成功產生
- 單次請求最大上傳大小由
Nginx設為25MB - 目前僅支援轉出 PDF
- 目前僅允許 Word 與 PowerPoint 格式,不含 Excel
- 轉檔流程使用暫存目錄
/tmp/convert - 每次轉檔逾時限制為
60秒
如果你不想透過 Docker,也可以直接在本機執行 API,但需自行安裝 LibreOffice。
pip install -r requirements.txtuvicorn app.app:app --host 0.0.0.0 --port 8000接著可直接呼叫:
http://localhost:8000/healthhttp://localhost:8000/convert
Dockerfile 內安裝了以下主要元件:
LibreOfficeLibreOffice WriterLibreOffice Impress- 常見字型:
fonts-noto、fonts-noto-cjk、fonts-dejavu
這些字型有助於降低文件轉 PDF 時的字型缺失問題,尤其是中日韓文字內容。
docker-compose.yml 會啟動兩個服務:
api: FastAPI + LibreOffice 轉檔服務nginx: 對外提供8080,並代理到api:8000
- API 應用程式入口位於
app/app.py - Nginx 設定位於
nginx/nginx.conf - 預設啟動指令使用
uvicorn單一 worker