记录一下C#实现word转pdf时,遇到的问题

最近接手这个功能需求,记录一下在实现功能过程中,遇到的一些问题,供参考学习,欢迎提问

1.命名空间引用的问题

  • Q:Microsoft.Office 无法找到office命名空间
  • A:找到你的项目引用,引用com里面的这个,就不报错了

  • Q:如果上诉问题解决后,word又开始报错,无法找到命名空间
  • A:
  • 1.找到项目,右键管理NuGet程序包
  • 2.浏览,搜索Microsoft.offic,找到你需要用的功能这里我需要用的是word,所以我安装的word,安装完成后,命名空间就OK了~  完成了第一步

这里记录一下网上找来的代码,可用性自测

        /// <summary>
        /// word转pdf
        /// </summary>
        /// <param name="sourcePath">原路径</param>
        /// <param name="targetPath">目标路径</param>
        /// <returns></returns>
        public bool WordToPDF(string sourcePath, string targetPath)
        {
            bool result = false;
            Microsoft.Office.Interop.Word.Application application = new                 
            Microsoft.Office.Interop.Word.Application();
            Document document = null;
            try
            {
                application.Visible = false;
                document = application.Documents.Open(sourcePath);
                document.ExportAsFixedFormat(targetPath, 
                WdExportFormat.wdExportFormatPDF);
                result = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                result = false;
            }
            finally
            {
                document.Close();
            }
            return result;
        }

以上代码我本地实测运行后,会在Microsoft.Office.Interop.Word.Application application = new                 
 Microsoft.Office.Interop.Word.Application();报错  ,报错信息是检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046} 的组件时失败,这个可能是由于权限问题导致无法访问到,具体解决办法可以百度,我这里放一篇解决办法

检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046} 的组件时失败 - 极客分享

2.文件是以文件流方式存在数据库中,没有实体路径怎么办

     在刚接手这个功能时候,我以为是以实体文件存在磁盘上,是有物理路径的,但是后来发现,是以base64流存在数据库中,然后直接输出展示,没有物理路径,所以这里就需要转换

  1. 把base64流转换为文件存在磁盘上,首先创建一个文件,路径
                string FileName = "***";
                //创建存储路径
                string path = ConfigurationManager.AppSettings.Get("****");

    因为本地磁盘和服务器上磁盘路径可能不同,所以这里推荐使用配置文件

  2. 判断文件或者路径是否已经存在磁盘上,因为我的文件是以base64流存在数据库里,如果用户每次访问,我都需要在磁盘上去生成一个文件,一个公文流程可能会有很多人办理,这样就造成了无用数据过多,长时间累计拖慢运行速度,所以要先进行判断是否存在,如果存在可以直接进行下载
                if (!Directory.Exists(path))//判断是否存在路径
                {
                    Directory.CreateDirectory(path);
                }
                string TemFielPath = path + FileName;
                if (System.IO.File.Exists(TemFielPath))
                {
                    return Json(true);//本地已存在文件,不在进行转存
                }

  3. 上诉判断完成后,就可以从数据库中,去读取流并存储下来,采用byte[] 存储,这步很简单直接上代码
    byte[] file = dbFile.OpenBinaryAsByte(FileID);//此处只是演示,需更换为自己的方法体

      4.  接下来就是进行转换问题,利用stream把文件写在磁盘  

                    string filePath = Path.Combine(path, FileName);
                    FileStream fs = new FileStream(filePath, FileMode.Create);
                    fs.Write(file, 0, file.Length);
                    fs.Flush();
                    fs.Close();

         这里需要注意,stream用完后需要进行flush清除缓存与close关闭,不然文件虽然会在磁盘上,但是读取会出问题


这里介绍第二种更加方便的转换方法,用第三方组件Aspose.Words

使用方法很简单,同样需要导入Nuget包,搜索Aspose.Word,导入项目就可以了

在方法中引用

代码实现:

//srcDocPath 原路径
//dstPdfPath 目标路径,需要具体到文件名
public void Word2PDF(string srcDocPath, string dstPdfPath)
        {
            // Load the document from disk.
            Document srcDoc = new Document(srcDocPath);
            // Save the document in PDF format.
            srcDoc.Save(dstPdfPath, SaveFormat.Pdf);

        }

如果遇到字体消失问题,可在转换的时候,将字体源添加

string userFonts = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Microsoft\\Windows\\Fonts\\";
            ArrayList fontSource = new ArrayList(FontSettings.DefaultInstance.GetFontsSources());
            Aspose.Words.Fonts.FolderFontSource folderFontSource = new Aspose.Words.Fonts.FolderFontSource(userFonts, true);
            fontSource.Add(folderFontSource);
            Aspose.Words.Fonts.FontSourceBase[] fontSources = (Aspose.Words.Fonts.FontSourceBase[])fontSource.ToArray(typeof(Aspose.Words.Fonts.FontSourceBase));
            FontSettings.DefaultInstance.SetFontsSources(fontSources);

没错,就两句代码就能完成,这个相对用office组件更为方便,但是美中不足就是,这个不是免费的,在进行pdf转换后,会添加水印,至于如何去掉这个水印,可以去论坛找别的破解的dll,这里我就不放置了,剩下的功能就是下载了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值