以下能幫助你可以使用任何開發語言,在任何平臺都能使用 LibreOffice 實現 Word、Excel、PPT 等文檔的自動轉換,目前展示在 ASP.NET Core 中為 PDF的實戰案例,其他的文檔格式轉換邏輯同理。
📦 1. 安裝 LibreOffice
🐧 Linux(Docker 或 Ubuntu)中安裝 LibreOffice
在 Dockerfile
或本機終端中運行:
sudo apt-get update
sudo apt-get install -y libreoffice fonts-noto-cjk
或者 Dockerfile 示例:
RUN apt-get update && \apt-get install -y libreoffice fonts-noto-cjk && \apt-get clean && \rm -rf /var/lib/apt/lists/*
🧩 Windows 安裝 LibreOffice
-
下載 LibreOffice Windows 安裝包
-
安裝路徑一般為:
C:\Program Files\LibreOffice\program\soffice.exe
-
將 LibreOffice 加入系統環境變量:
-
打開“系統環境變量”
-
把
C:\Program Files\LibreOffice\program
添加到系統 PATH 中
-
?? 2. 在 ASP.NET Core 中實現文檔轉 PDF
以下是一個兼容 Windows + Linux 的通用后端控制器代碼:
[HttpPost("convert-to-pdf")]
public async Task<IActionResult> ConvertToPdf(IFormFile file)
{// 1. 檢查是否上傳了文件if (file == null || file.Length == 0)return BadRequest("No file uploaded.");// 2. 創建臨時文件夾(系統臨時目錄下的 /docconvert)var tempDir = Path.Combine(Path.GetTempPath(), "docconvert");Directory.CreateDirectory(tempDir); // 確保文件夾存在// 3. 構造輸入文件路徑(帶唯一 ID)var inputPath = Path.Combine(tempDir, Guid.NewGuid() + Path.GetExtension(file.FileName));// 4. 構造輸出文件路徑(同名但改為 .pdf)var outputPath = Path.ChangeExtension(inputPath, ".pdf");// 5. 保存上傳的文件到臨時路徑await using (var stream = new FileStream(inputPath, FileMode.Create))await file.CopyToAsync(stream);// 6. 判斷當前系統平臺:Windows 或 Linux/macOSvar isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);// 7. 設置 LibreOffice 執行路徑// Windows 下可以是 "C:\\Program Files\\LibreOffice\\program\\soffice.exe"// Linux/macOS 下一般就是 "soffice",前提是已加入 PATHvar sofficePath = isWindows ? "soffice.exe" : "soffice";// 8. 構建命令行參數:無頭模式、轉換為 pdf、指定輸出目錄var args = $"--headless --convert-to pdf \"{inputPath}\" --outdir \"{tempDir}\"";// 9. 創建進程配置var process = new Process{StartInfo = new ProcessStartInfo{FileName = sofficePath, // 可執行文件路徑Arguments = args, // 命令參數RedirectStandardOutput = true, // 捕獲 stdoutRedirectStandardError = true, // 捕獲 stderrUseShellExecute = false, // 必須為 false 以重定向輸出CreateNoWindow = true // 不顯示命令行窗口}};// 10. 啟動轉換進程process.Start();// 11. 可選:捕獲轉換日志(用于調試)string output = await process.StandardOutput.ReadToEndAsync();string error = await process.StandardError.ReadToEndAsync();// 12. 等待 LibreOffice 完成轉換await process.WaitForExitAsync();// 13. 檢查輸出 PDF 是否生成成功if (!System.IO.File.Exists(outputPath))return StatusCode(500, $"PDF conversion failed. Error: {error}");// 14. 讀取生成的 PDF 并返回給客戶端var fileBytes = await System.IO.File.ReadAllBytesAsync(outputPath);return File(fileBytes, "application/pdf", Path.GetFileName(outputPath));
}
🧪 測試方法
你可以使用 Postman 或 Swagger 上傳 Word、Excel、PPT、CSV、TXT 文件,接口會自動返回 PDF 文件。
📁 支持的輸入格式
輸入格式 | 支持 |
---|---|
.doc , .docx | ? Word 轉 PDF |
.xls , .xlsx | ? Excel 轉 PDF |
.ppt , .pptx | ? PPT 轉 PDF |
.odt , .ods , .odp | ? Libre 格式也支持 |
.csv , .html , .txt | ? 簡單格式也支持 |
📌 注意事項
-
中文亂碼問題:Linux 下請安裝
fonts-noto-cjk
,Windows 安裝系統字體即可。 -
路徑中不建議含中文(尤其是 Linux 容器),否則
soffice
可能失敗。 -
soffice.exe 路徑問題:
-
Windows 如果沒加入 PATH,可寫完整路徑:
var sofficePath = @"C:\Program Files\LibreOffice\program\soffice.exe";
-
? 總結
項目 | Windows | Linux(容器) |
---|---|---|
LibreOffice 安裝路徑 | C:\Program Files\LibreOffice | apt install libreoffice |
中文支持 | 系統字體已集成 | 安裝 fonts-noto-cjk |
調用方式 | soffice.exe | soffice |
路徑注意事項 | 路徑中避免中文空格 | 必須避免中文 |
性能 | 快速 | 第一次啟動稍慢,可預熱處理 |