ali linux 安装libreoffice
sudo yum install libreoffice-headless libreoffice-writer# 检查版本
libreoffice --version# 测试转换功能
libreoffice --headless --convert-to pdf test.docx --outdir /tmp
C#实现:
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;namespace SaaS.OfficialWebSite.Web.Controllers
{public class OfficeController : Controller{private readonly ILogger<OfficeController> _logger;public OfficeController(ILogger<OfficeController> logger){_logger = logger;}public IActionResult Index(){return View();}[HttpPost]public async Task<IActionResult> ConvertToPdf(){if (Request.Form.Files.Count == 0)return BadRequest("No file uploaded");var file = Request.Form.Files[0];if (file.Length == 0)return BadRequest("Empty file");// 验证文件类型var allowedExtensions = new[] { ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx" };var fileExtension = Path.GetExtension(file.FileName).ToLower();if (!allowedExtensions.Contains(fileExtension))return BadRequest("Unsupported file type");try{// 创建临时目录var tempFolder = Path.Combine(Directory.GetCurrentDirectory(), "Uploads");if (!Directory.Exists(tempFolder)){Directory.CreateDirectory(tempFolder);}// 生成唯一文件名var uniqueId = Guid.NewGuid().ToString();var inputPath = Path.Combine(tempFolder, $"{uniqueId}{fileExtension}");var outputPath = Path.Combine(tempFolder, $"{uniqueId}.pdf");// 保存上传的文件using (var stream = new FileStream(inputPath, FileMode.Create)){await file.CopyToAsync(stream);}// 调用 LibreOffice 转换var result = await ConvertWithLibreOffice(inputPath, outputPath);if (!result.success){_logger.LogError(Newtonsoft.Json.JsonConvert.SerializeObject(result));return StatusCode(500, result.message);}// 清理临时文件System.IO.File.Delete(inputPath);// 返回下载URLvar outputFileName = Path.GetFileNameWithoutExtension(outputPath) + ".pdf";var downloadUrl = Url.Action("Download", "Office", new { fileName = outputFileName, originalName = file.FileName }, Request.Scheme);downloadUrl = downloadUrl.Replace("http", "https");return Ok(new{success = true,downloadUrl = downloadUrl});}catch (Exception ex){_logger.LogError(ex,ex.Message);return StatusCode(500, $"Conversion failed: {ex.Message}");}}private async Task<(bool success, string message)> ConvertWithLibreOffice(string inputPath, string outputPath){try{var psi = new ProcessStartInfo{FileName = "libreoffice",Arguments = $"--headless --convert-to pdf \"{inputPath}\" --outdir \"{Path.GetDirectoryName(outputPath)}\" ",RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false,CreateNoWindow = true};using var process = Process.Start(psi);await process.WaitForExitAsync();if (process.ExitCode != 0){var error = await process.StandardError.ReadToEndAsync();return (false, $"LibreOffice error: {error}");}return (true, null);}catch (Exception ex){return (false, $"Process error: {ex.Message}");}}[HttpGet]public IActionResult Download(string fileName,string originalName){var tempFolder = Path.Combine(Directory.GetCurrentDirectory(), "Uploads");if (!System.IO.File.Exists(Path.Combine(tempFolder, fileName))){return NotFound();}var fileStream = new FileStream(Path.Combine(tempFolder,fileName), FileMode.Open, FileAccess.Read);var result = File(fileStream, "application/pdf", Path.GetFileNameWithoutExtension(originalName) + ".pdf");// 文件下载后删除Response.OnCompleted(async () =>{fileStream.Dispose();try { System.IO.File.Delete(Path.Combine(tempFolder, fileName)); } catch { }});return result;}}public static class ProcessExtensions{public static Task WaitForExitAsync(this Process process){var tcs = new TaskCompletionSource<bool>();process.EnableRaisingEvents = true;process.Exited += (s, e) => tcs.SetResult(true);return tcs.Task;}}
}
运行效果:Office转PDF在线转换器