安装LibreOffice 7.2插件
使用的开发工具是VS2022,.NET6.0的项目框架。要实现office文件转pdf要先安装一个好用的插件。
1.到官网下载: LibreOffice下载地址
2.安装,这里我选择的是企业版
安装后文件目录结构:
3.配置环境变量,配置完成后可以使用cmd命令直接转换office文件为pdf文件,无须打开桌面的LibreOffice客户程序。
配置路径为,桌面上的电脑图标,右键“属性”-“高级系统设置”-“高级”-“环境变量”.
在Path变量下设置增加环境变量值:
我这里安装在f盘,设置如下。
F:\SoftWare\libreOffice\program
这里设置了两个地方的Path变量,一个是用户变量,一个是系统变量。
设置完成就可以来使用cmd命令检验下是否生效了。
使用cmd命令提示工具实现文件转换
1.快捷键win+R:打开cmd命令提示工具。
2.输入命令 “ cmd /c soffice --headless --convert-to pdf F:/xx文件夹/测试文件.doc --outdir F:/xx文件夹/ ”,前面文件地址是绝对地址代表要转换生成的文件,后面地址是要生成到目标文件夹。按下Enter执行命令,在目标文件夹下面即会生成一个“测试文件.pdf”的新文件。这里验证了插件可以正常使用。
ps:当然有的电脑,不能识别这个soffice,可以使用soffice.exe来替换。就可以找到
在c#代码中调用cmd命令,程序自动执行转换文件
下面是执行cmd命令的代码片段
/// <summary>
/// office文件转pdf
/// </summary>
/// <param name="officePath">输入文件夹地址</param>
/// <param name="outPutPath">输出文件地址</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpGet("OfficeToPdf")]
public bool OfficeToPdf(string officePath = "F:/测试文件夹/机构图号命名规则.doc", string outPutPath = "F:/测试文件夹/")
{
var result = false;
try
{
//拼接cmd命令,此命令执行前要确保环境变量有值
string strCMD = $" soffice --headless --convert-to pdf {officePath} --outdir {outPutPath}";
//调用cmd命令提示符工具
using (var process = new Process())
{
process.StartInfo.FileName = "cmd.exe";
//cmd / c xxxx:是执行完dir命令后关闭命令窗口;cmd / k xxxx:是执行完dir命令后不关闭命令窗口。
process.StartInfo.Arguments = "/c " + strCMD; // "soffice --headless --convert-to pdf F:/测试文件夹/机构图号命名规则.doc --outdir F:/测试文件夹/";
process.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
process.StartInfo.CreateNoWindow = true; //是否在新窗口中启动该进程的值 (不显示程序窗口)
//process.StartInfo.WorkingDirectory = @"C:/Windows/system32"; // 重定向错误输出
process.Start();
process.WaitForExit(); //等待程序执行完退出进程
process.Close();
}
//查询文件是否存在,存在则返回ture
var fileName = Path.GetFileName(officePath);
if (fileName == "" || string.IsNullOrEmpty(fileName)) { return result; }
var newFileName = Path.GetFileNameWithoutExtension(fileName) + ".pdf";
newFileName = Path.Combine("F:/测试文件夹/", newFileName);
if (System.IO.File.Exists(newFileName))
{
result = true;
}
return result;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
运行此段代码,可以发现同样生成了一个”机构图号命名规则.pdf“文件。
发布到IIS服务器
发布到IIS后发现执行完接口方法,界面就一直加载中,也没有文件生成。并不能实现生成文件的效果。
解决方法:
网站发布的”应用程序池“-”高级设置“
1.启用32位应用程序设置为True
2.托管管道模式为经典 Classic
3.进程模型中-”标识“-默认内置账户是”ApplicationPoolIdentity“改为”LocalSystem“。
接口重新调用后,就可以生成新的pdf文件了。
至此一个完整的方法就完结了。
参考了好几个博主的文章,其中最有灵感的是这个博主的文章。
【libreoffice】libreoffice实现office转pdf、html、jpg等格式数据