Skip to content
Go back

C#中将Word文档转成PDF

Published:  at  05:00 AM

在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。");
    }

}

Share this post on:

Next Post
WSL2网络代理设置