通过c#或IronPython在后台进程中将Word转换为PDF

通过c#或IronPython在后台进程中将Word转换为PDF,c#,ms-word,pdf-generation,ironpython,C#,Ms Word,Pdf Generation,Ironpython,我在网上找到了许多将word(.docx)文件转换为.pdf文件的例子 当我从UI线程运行时,它工作正常。 但当我在后台执行它的时候。然后它失败了。 有没有办法通过后台进程执行将Word转换为PDF 下面是在UI线程上工作的IronPython和c#代码 IronPython: 导入系统 导入clr 导入系统 从System.Text导入StringBuilder 从System.IO导入目录信息、文件、文件信息、路径、StreamWriter clr.AddReference(“Microso

我在网上找到了许多将word(.docx)文件转换为.pdf文件的例子

当我从UI线程运行时,它工作正常。 但当我在后台执行它的时候。然后它失败了。 有没有办法通过后台进程执行将Word转换为PDF

下面是在UI线程上工作的IronPython和c#代码

IronPython:

导入系统 导入clr 导入系统 从System.Text导入StringBuilder 从System.IO导入目录信息、文件、文件信息、路径、StreamWriter clr.AddReference(“Microsoft.Office.Interop.Word”) 将Microsoft.Office.Interop.Word导入为Word def ConvertWordToPDF(wordDocFullPath): """ SNI 将Word文档转换为PDF。 Word文档完整路径。 PDF完整路径 """ wordDocInfo=FileInfo(wordDocFullPath) pdfFullPath=Path.Combine(wordDocInfo.DirectoryName,wordDocInfo.Name.TrimEnd(wordDocInfo.Extension.ToCharArray())+'.pdf') word\u application=word.ApplicationClass() word_application.visible=False wordDocument=word\u application.Documents.Open(wordDocFullPath); 如果是wordDocument: wordDocument.ExportAsFixedFormat(pdfFullPath,Word.WdExportFormat.wdExportFormatPDF); wordDocument.Close() word_应用程序。退出() word\u应用程序=无 其他: 打印“未能初始化word文档” 打印pdfFullPath 返回pdfFullPath` c#代码:

公共字符串转换(字符串wordDocPath)
{
string pdfPath=string.Empty;
尝试
{
Microsoft.Office.Interop.Word.Application Word=null;
单据单据=空;
//C#没有可选参数,因此我们需要一个伪值
对象omising=System.Reflection.Missing.Value;
object saveChanges=WdSaveOptions.wdDoNotSaveChanges;
尝试
{
word=新的Microsoft.Office.Interop.word.Application();
睡眠(5000);
可见字=假;
word.screenUpdate=false;
doc=word.Documents.Open(wordDocPath);
pdfPath=wordDocPath.Replace(“.docx”,“.pdf”);
doc.ExportAsFixedFormat(
pdfPath,
Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF,
OptimizeFor:Microsoft.Office.Interop.Word.WdExportOptimizeFor.WdExportOptimizeFor屏幕上,
BitmapMissingFonts:true,DocStructureTags:false);
((Microsoft.Office.Interop.Word._文档)doc).Close();
(_应用程序)word).退出(ref-omising,ref-omising,ref-omising);
}
抓住
{
如果(doc!=null)
{
((_文档)文档)。关闭(引用保存更改、引用删除、引用删除);
}
if(word!=null)
{
(_应用程序)word).退出(ref-omising,ref-omising,ref-omising);
}
投掷;
}
}
捕获(例外情况除外)
{
var st=新堆栈跟踪(ex,true);
//获取顶部堆栈帧
var frame=st.GetFrame(0);
//从堆栈帧中获取行号
var line=frame.GetFileLineNumber();
抛出新异常(“行号:“+Line.ToString()+”+ex.ToString());
}
返回pdfPath;
}

从我的同事安德斯那里得知以下答案

这里的秒回答说微软不支持这种无人值守的自动化。 它还建议使用​​

我刚刚验证了此脚本是否有效-也可以通过作业/后台流程:

虽然这不是一个自由软件,但它是在后台工作的过程。 它也可以很容易地移植到c#,因为它是一个.net dll

导入clr

clr.AddReferenceToFileAndPath(r“C:\ProgramFiles(x86)\e-iceblue\Spire.Doc FE\Bin\NET4.0\Spire.Doc.dll”)

从Spire.Doc导入*

从Spire.Doc.Documents导入*

从System.IO导入目录信息、文件、文件信息、路径

def ConvertWordTopD使用Spire(wordDocFullPath):

“”“
SNI
将Word文档转换为PDF。
Word文档完整路径。
PDF完整路径
"""
wordDocInfo=FileInfo(wordDocFullPath)
pdfFullPath=Path.Combine(wordDocInfo.DirectoryName,wordDocInfo.Name.TrimEnd(wordDocInfo.Extension.ToCharArray())+'.pdf')
文件=文件();
document.LoadFromFile(wordDocFullPath);
#将Word转换为PDF
保存文件(pdfFullPath,FileFormat.PDF);
那么,c#代码中有什么失败了?错误是否与“无法从创建对象时所在的其他线程访问对象”有关?从c#它抛出对象引用未设置为对象错误的实例。此外,当使用python进行测试时,我能够在它中断的行中找到零,它无法在下面的行doc=word.Documents.Open(wordDocPath)初始化文档对象;由于在后台进程上运行而没有UI线程。
"""

<Script>

<Author>SNI</Author>

<Description>Converts Word document to PDF.</Description>

<Parameters>

<Parameter name="wordDocFullPath" type="string">Word document full path.</Parameter>

</Parameters>

<ReturnValue type="string">PDF full path</ReturnValue>

</Script>

"""

wordDocInfo = FileInfo(wordDocFullPath)

pdfFullPath = Path.Combine(wordDocInfo.DirectoryName, wordDocInfo.Name.TrimEnd(wordDocInfo.Extension.ToCharArray()) + '.pdf')




document = Document();

document.LoadFromFile(wordDocFullPath);




# Convert Word to PDF



document.SaveToFile(pdfFullPath, FileFormat.PDF);