Web API 无法执行 soffice.exe --convert-to pdf 命令
Web API cannot execute soffice.exe --convert-to pdf command
我想通过我的 API 上传一个 docx 文件,它需要 return 我一个由 libreoffice soffice.exe 过程转换的 pdf 文件。
但是这个return我是个错误:
Error: source file could not be loaded
此错误是由 soffice.exe 进程引发的。
当我尝试直接执行 soffice.exe 过程时(不是通过 api 调用),他成功地将我的 docx 文件转换为 pdf。
我的代码:
控制器:
[HttpPost]
public IActionResult Post(IFormFile docxFile)
{
if (docxFile == null)
{
return BadRequest();
}
if (docxFile.ContentType != "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
{
ModelState.AddModelError("message", "Wrong file type provided. Only docx file are accepted.");
return UnprocessableEntity(ModelState);
}
string filePath = "C:\temp.docx";
using (Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
docxFile.CopyTo(stream);
}
ProcessStartInfo procStartInfo =
new("C:\Program\LibreOffice\program\soffice.exe", $"--convert-to pdf --nologo '{Path.GetFileName(Path.GetFullPath(filePath))}'")
{
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Normal,
CreateNoWindow = true,
WorkingDirectory = Path.GetDirectoryName(Path.GetFullPath(filePath)) ?? string.Empty
};
using (Process process = new() {StartInfo = procStartInfo,})
{
process.OutputDataReceived += (sender, data) => Console.WriteLine(data.Data);
process.ErrorDataReceived += (sender, data) => Console.WriteLine(data.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
}
FileStream fileStream = System.IO.File.Open(filePath.Replace(".docx", ".pdf"), FileMode.Open);
return File(fileStream, "application/octet-stream", Path.GetFileName(fileStream.Name));
}
特点:
- ASP.NET 网络 Api .Net 5
- Libre Office 版本:7.1.5
可能是这个函数{Path.GetFileName(Path.GetFullPath(filePath))}
?
据我了解,它 returns 只有文件名和路径的扩展名
as described in this example from Microsoft
你为什么不直接使用你的变量filePath
?
编辑:
我刚刚注意到您正在为该过程使用 WorkingDirectory。
Soffice 可能无法为其参数使用相对路径。
我想通过我的 API 上传一个 docx 文件,它需要 return 我一个由 libreoffice soffice.exe 过程转换的 pdf 文件。
但是这个return我是个错误:
Error: source file could not be loaded
此错误是由 soffice.exe 进程引发的。
当我尝试直接执行 soffice.exe 过程时(不是通过 api 调用),他成功地将我的 docx 文件转换为 pdf。
我的代码:
控制器:
[HttpPost]
public IActionResult Post(IFormFile docxFile)
{
if (docxFile == null)
{
return BadRequest();
}
if (docxFile.ContentType != "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
{
ModelState.AddModelError("message", "Wrong file type provided. Only docx file are accepted.");
return UnprocessableEntity(ModelState);
}
string filePath = "C:\temp.docx";
using (Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
docxFile.CopyTo(stream);
}
ProcessStartInfo procStartInfo =
new("C:\Program\LibreOffice\program\soffice.exe", $"--convert-to pdf --nologo '{Path.GetFileName(Path.GetFullPath(filePath))}'")
{
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Normal,
CreateNoWindow = true,
WorkingDirectory = Path.GetDirectoryName(Path.GetFullPath(filePath)) ?? string.Empty
};
using (Process process = new() {StartInfo = procStartInfo,})
{
process.OutputDataReceived += (sender, data) => Console.WriteLine(data.Data);
process.ErrorDataReceived += (sender, data) => Console.WriteLine(data.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
}
FileStream fileStream = System.IO.File.Open(filePath.Replace(".docx", ".pdf"), FileMode.Open);
return File(fileStream, "application/octet-stream", Path.GetFileName(fileStream.Name));
}
特点:
- ASP.NET 网络 Api .Net 5
- Libre Office 版本:7.1.5
可能是这个函数{Path.GetFileName(Path.GetFullPath(filePath))}
?
据我了解,它 returns 只有文件名和路径的扩展名
as described in this example from Microsoft
你为什么不直接使用你的变量filePath
?
编辑: 我刚刚注意到您正在为该过程使用 WorkingDirectory。 Soffice 可能无法为其参数使用相对路径。