在C#中将word转成PDF的库,基本都是要商业授权的,一个折中的方案是依赖本机Windows上安装的office或者WPS,使用Microsoft.Office.Interop.Word
将word转成PDF。完整工具类代码:
public static class WordToPdfUtil
{
/// <summary>
/// 使用WPS Office将Word转换为PDF
/// </summary>
private static bool ConvertWithWPS(string wordPath, string pdfPath)
{
dynamic wpsApp = null;
dynamic doc = null;
try
{
// 尝试创建WPS Application对象
Type wpsType = Type.GetTypeFromProgID("KWPS.Application") ??
Type.GetTypeFromProgID("wps.Application") ??
Type.GetTypeFromProgID("WPS.Application");
if (wpsType == null)
throw new Exception("无法创建WPS应用程序对象。");
wpsApp = Activator.CreateInstance(wpsType);
wpsApp.Visible = false;
wpsApp.DisplayAlerts = false;
// 打开文档
doc = wpsApp.Documents.Open(wordPath);
// 导出为PDF
doc.ExportAsFixedFormat(pdfPath, 17); // 17通常代表PDF格式
doc.Close();
return true;
}
catch
{
return false;
}
finally
{
// 清理资源
if (doc != null)
Marshal.ReleaseComObject(doc);
if (wpsApp != null)
{
//wpsApp.Quit();
Marshal.ReleaseComObject(wpsApp);
}
}
}
/// <summary>
/// 使用office将word转成PDF
/// </summary>
/// <param name="sourcePath"></param>
/// <param name="targetPath"></param>
private static bool ConvertWithOffice(string sourcePath, string targetPath)
{
Application wordApp = null;
Document doc = null;
try
{
wordApp = new Application();
wordApp.Visible = false;
wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
doc = wordApp.Documents.Open(sourcePath);
// 设置为PDF格式并进行转换
doc.ExportAsFixedFormat(targetPath, WdExportFormat.wdExportFormatPDF);
doc.Close(false);
return true;
}
catch
{
return false;
}
finally
{
// 确保清理资源,避免进程残留
if (doc != null)
{
Marshal.ReleaseComObject(doc);
}
if (wordApp != null)
{
wordApp.Quit();
Marshal.ReleaseComObject(wordApp);
}
}
}
private static bool IsOfficeInstalled()
{
try
{
var app = new Application();
app.Quit();
Marshal.ReleaseComObject(app);
return true;
}
catch
{
return false;
}
}
private static bool IsWPSInstalled()
{
try
{
// 常见的WPS ProgID
string[] wpsProgIDs = { "KWPS.Application", "wps.Application", "WPS.Application" };
foreach (string progId in wpsProgIDs)
{
Type wpsType = Type.GetTypeFromProgID("KWPS.Application");
if (wpsType != null)
{
dynamic app = Activator.CreateInstance(wpsType);
Marshal.ReleaseComObject(app);
return true;
}
}
return false;
}
catch
{
return false;
}
}
/// <summary>
/// word 换 PDF
/// </summary>
/// <param name="wordPath"></param>
/// <param name="pdfPath"></param>
/// <returns>bool 转换是否成功</returns>
/// <exception cref="FileNotFoundException"></exception>
/// <exception cref="Exception"></exception>
public static bool Convert(string wordPath, string pdfPath)
{
// 检查文件是否存在
if (!File.Exists(wordPath))
throw new FileNotFoundException("找不到指定的Word文档", wordPath);
try
{
var existOffice = IsOfficeInstalled();
if (existOffice)
{
return ConvertWithOffice(wordPath, pdfPath);
}
var existWps = IsWPSInstalled();
if (existWps)
{
return ConvertWithWPS(wordPath, pdfPath);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
return false;
}
throw new Exception("系统未安装Microsoft Office或WPS Office。");
}
}