首页 > 编程语言 >c# 通过代码调用WPS将Word转为PDF

c# 通过代码调用WPS将Word转为PDF

时间:2023-10-31 16:03:46浏览次数:27  
标签:WPS Word c# word dll 组件 sourceWordPath wps

最近在使用Spire.Doc的过程中,发现在将word文件转为PDF时,一旦页数过多(具体超过多少页会报错暂未求证),会直接报错(Object reference not set to an instance of an object.),堆栈信息如下:

当然,我这是免费版的,功能被阉割很正常,所以这两天一直在寻找替代品。

中间了解到可以使用微软官方的组件Microsoft.Office.Interop.Word去操作,奈何需要先安装office,奈何本地只有WPS,就想着能不能用WPS实现下。

经搜索后果然可以实现,但是实践下来遇到了很多坑,故在此记录下,希望大伙遇到同样的问题时,就不用耽搁太久了。

说下操作步骤:

1、本地要安装WPS。

2、在项目中添加引用,点击“COM”,勾选下图中的两个组件,即wpsapi.dll、ksoapi.dll,其中wpsapi.dll是操作word的组件,ksoapi.dll是wpsapi.dll依赖的组件:

 3、完成以上操作后,写好测试代码,开始运行即可,下面贴出我的测试代码:

 1         /// <summary>
 2         /// word转pdf
 3         /// </summary>
 4         /// <param name="sourceWordPath">源文件路径<see cref="string"/>.</param>
 5         /// <param name="newPdfPath">新文件路径<see cref="string"/>.</param>
 6         /// <returns>The <see cref="bool"/>.</returns>
 7         public static void WordToPdf(string sourceWordPath, string newPdfPath)
 8         {
 9             if (sourceWordPath == null) throw new ArgumentNullException(nameof(sourceWordPath));
10             if (newPdfPath == null) throw new ArgumentNullException(nameof(newPdfPath));
11 
12             var type = Type.GetTypeFromProgID("KWps.Application");
13             dynamic wps = Activator.CreateInstance(type);
14 
15             //ApplicationClass wps = new ApplicationClass();
16             //用上行注释的方式初始化的话,会报错误:
17             //检索 COM 类工厂中 CLSID 为 {000209FF-0000-4B30-A977-D214852036FE} 的组件失败,
18             //原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
19 
20             try
21             {
22                 //用wps打开word不显示界面
23                 dynamic doc = wps.Documents.Open(sourceWordPath, Visible: false);
24 
25                 //转pdf
26                 doc.ExportAsFixedFormat(newPdfPath, WdExportFormat.wdExportFormatPDF);
27 
28                 doc.Close();
29             }
30             catch (Exception e)
31             {
32                 Console.WriteLine(e.Message);
33             }
34             finally
35             {
36                 wps.Quit();
37                 GC.Collect();
38                 GC.WaitForPendingFinalizers();
39             }
40 
41         }

到这里就算大功告成了。

最开始我是用.Net Core 3.1进行测试的,发现始终加载不了COM组件,最终使用.Net Framework 4.6.1测试没有问题

标签:WPS,Word,c#,word,dll,组件,sourceWordPath,wps
From: https://www.cnblogs.com/mzyyds/p/17800438.html

相关文章

  • linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法
    https://blog.csdn.net/moveym/article/details/125569233 一、首先了解Linux系统下这两个命令的区别yum:属于:RedHat系列常见系统有:Redhat、Centos、Fedora等apt-get:属于:Debian系列常见系统:Debian、Ubuntu等#查看当前系统版本cat/etc/redhat-release网易镜像系统官网......
  • Codeforces Round 906 (Div. 2)A-E1
    A.Doremy'sPaint3记数组中数的种类数为\(k\),当\(k=1\)时,答案为\(yes\);当\(k=2\)时,记两个种类的数的个数差为\(d\),当\(d≤1\)时,答案为\(yes\);其他情况答案为\(no\)。时间复杂度:\(O(nlogn)\)1voidsolve()2{3intn;cin>>n;45map<int,int>mp;6......
  • Is Homophily a Necessity for Graph Neural Networks?
    目录概MaY.,LiuX.,ShahN.andTangJ.Ishomophilyanecessityforgraphneuralnetworks?ICLR,2022.概探究Homophily假设(即相互连接的结点相似)对于GCN发挥效果是否是必须的.结论是如果图中的同一类的结点具有相似的邻居的分布,则Homophily不是必须的......
  • 洛谷P3805 【模板】manacher
    题目链接:https://www.luogu.com.cn/problem/P3805manacher算法模板题。参考资料:https://oi-wiki.org/string/manacher/示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2.2e7+5;intn;chars[maxn/2],a[maxn];intp[maxn];voidinit(){......
  • 安防视频监控平台EasyCVR(V.3.4)新功能:告警查询操作步骤
     视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼宇、校园、仓储等场......
  • CSS 中的 :root
    CSS中的:root:https://blog.csdn.net/weixin_51123974/article/details/122311909?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169873849916800192266666%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=1698738499168001922......
  • CSP-S2 好似记
    CSP-S2好似记似了,但还是发一下。一周前教练让写的。1min发呆5min缺省源10min通看一遍题5min仔细看T1,大概是一个简单搜索5min仔细看T2,大概是一个简单DP5min仔细看T1,5min仔细看T2,5min仔细看T1,5min仔细看T2,5min,看T1题面+模拟样例。看不懂。5min,......
  • P5404 [CTS2019] 重复 题解
    题目链接观察题目,我们发现直接计算是困难的,先构造单个合法的\(T\)分析其性质。为了构造出\(T\),先考虑构造时\(T\)时什么时候会出现不合法的情况,此时\(T\)会有一段和\(S\)相同的前缀,且这段前缀后面跟着的字符比\(S\)所跟的小。为了避免这种情况出现,我们需要在每次添......
  • 大坝水库安全监测终端MCU,智能化管理的新篇章!
    我国目前拥有超过9.8万座水库大坝,其中超过95%为土石坝,这些大坝主要是在上世纪80年代以前建造的。这些水库大坝在保障防洪、发电、供水、灌溉等方面发挥了巨大的作用,但是同时也存在一定的安全风险,比如坝体结构破损、坝基渗漏、坝体渗漏、坝面变形等安全隐患。由于这些隐患往往不易被......
  • c#耗时及性能监测
    c#耗时及性能监测在编程中,我们经常需要测量代码的执行时间,以便评估代码的性能和效率命名空间usingSystem.Diagnostics;字段字段说明Frequency获取以每秒刻度数表示的计时器频率。此字段为只读。IsHighResolution指示计时器是否基于高分辨率性能计数器。此字段......