以下能帮助你可以使用任何开发语言,在任何平台都能使用 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
安装路径一般为:
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/macOS
var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
// 7. 设置 LibreOffice 执行路径
// Windows 下可以是 "C:\\Program Files\\LibreOffice\\program\\soffice.exe"
// Linux/macOS 下一般就是 "soffice",前提是已加入 PATH
var 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, // 捕获 stdout
RedirectStandardError = true, // 捕获 stderr
UseShellExecute = 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 |
路径注意事项 | 路径中避免中文空格 | 必须避免中文 |
性能 | 快速 | 第一次启动稍慢,可预热处理 |