Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DOCX到PDF:SaveAs2 vs ExportAsFixedFormat vs打印输出_C#_.net_Pdf_Ms Word_Office Interop - Fatal编程技术网

C# DOCX到PDF:SaveAs2 vs ExportAsFixedFormat vs打印输出

C# DOCX到PDF:SaveAs2 vs ExportAsFixedFormat vs打印输出,c#,.net,pdf,ms-word,office-interop,C#,.net,Pdf,Ms Word,Office Interop,我的小目标是使用C#和.NET将大量的docx文件转换为PDF,而无需打开Word(显而易见),也无需使用任何第三方库(需要管理的组件更少,花费的资金更少)。目前,我正在尝试正确转换单个文档,它必须尽可能高效,以便快速转换前面提到的巨大负载(数千个docx文件,每个文件大小在100到300 kb之间) 我是 我正在创建Word应用程序的一个实例,如下所示 (): 以及按以下方式打开要转换的文档 Word.Document docxFile = word.Documents.Open(source

我的小目标是使用C#和.NET将大量的docx文件转换为PDF,而无需打开Word(显而易见),也无需使用任何第三方库(需要管理的组件更少,花费的资金更少)。目前,我正在尝试正确转换单个文档,它必须尽可能高效,以便快速转换前面提到的巨大负载(数千个docx文件,每个文件大小在100到300 kb之间)

我是

我正在创建Word应用程序的一个实例,如下所示
():

以及按以下方式打开要转换的文档

Word.Document docxFile = word.Documents.Open(sourcePath, Visible: false);
我成功地使用了3种方法将100KB的docx文件转换为pdf:

Microsoft.Office.Interop.Word.Document.SaveAs2
Duration | pdf大小
————————————————————————
75307毫秒| 277 kb

Microsoft.Office.Interop.Word.Document.ExportAsFixedFormat
Duration | pdf大小
————————————————————————
78351333毫秒| 285 kb

Microsoft.Office.Interop.Word.Document.PrintOut
Duration | pdf大小
————————————————————————
9985403毫秒| 290 kb
最后一个选项还有两个缺点:

  • 它会打开一个显示打印进度的小对话框或弹出窗口,我想这会导致运行时间稍微延长
  • 必须先通过
    docxFile.Activate()
    激活文档,否则会引发
    COMException

时间测量/估计:
在对已打开的文档开始转换之前,我只需选择一个
DateTime.Now
,然后在关闭该文档之后选择另一个
DateTime.Now
。然后我从第二个减去第一个:

DateTime conversionBegin = DateTime.Now;
// conversion followed by closing the document
...
DateTime conversionEnd = DateTime.Now;

TimeSpan conversionTime = conversionEnd.Subtract(conversionBegin);
Console.WriteLine("Conversion time: " + conversionTime.TotalMilliseconds + " ms");
我知道这不是一个非常可靠的时间测量,但我真的不需要。我只是想看看是否有显著的差异

这就引出了一个问题

为什么每个生成PDF的内容看起来完全相同,但转换时间不同,生成的文件大小不同? 也许我会删除以下文本以避免投票接近,但现在:
这只是一个额外信息的请求,需要回答的问题是上面的问题:
我想另外阅读针对这些问题的意见、提示、建议或建议

一次运行数千次转换时,将docx转换为pdf的首选方式是什么?


哪些参数或方法的参数值可能会缩短转换时间?

您是否碰巧拥有SharePoint内部部署?如果是,请使用Word自动化服务。关于结果如何/为什么产生的问题:这需要对Microsoft代码和使用的Adobe“引擎”有深入的了解。@Cindymister不幸的是,我真的不知道。。。我得问问管理员。需要几分钟…@Cindymister好的,没有SharePoint内部部署可用。我必须自己选择一个选项。谢谢你的建议。FWIW在你的位置上,我会对大量不同内容的文档进行测试,看看结果(PDF的外观)在所有情况下是不同还是相同。如果它们不同,请选择产生最佳结果的方法。除此之外,我更倾向于使用SaveAs2,因为基于我多年来遇到的问题,它在不同系统(Windows版本、Mac)中似乎更可靠。@Cindymister谢谢你的建议。目前,我必须坚持使用
打印输出
,因为还有一个问题:我必须只打印实际包含内容的页面,而不是空白页面,因为各种分节符会使文档在下一个奇数或偶数页面上继续。例如,在
SaveAs2
ExportAsFixedFormat
之前,我无法相应地调整文档,因为我无法告诉他们导出/保存页面
“1、3、4、5、6”
。结果不是很好,因为打印机设置似乎在结果周围添加了额外的空格。
Word.Document docxFile = word.Documents.Open(sourcePath, Visible: false);
docxFile.SaveAs2(FileName: outputPath,
                FileFormat: Word.WdSaveFormat.wdFormatPDF);
docxFile.ExportAsFixedFormat(OutputFileName: outputPath,
                            ExportFormat: Word.WdExportFormat.wdExportFormatPDF,
                            OptimizeFor: Word.WdExportOptimizeFor.wdExportOptimizeForOnScreen);
docxFile.Activate();
docxFile.PrintOut(
    OutputFileName: outputPath,
    PrintToFile: true
);
DateTime conversionBegin = DateTime.Now;
// conversion followed by closing the document
...
DateTime conversionEnd = DateTime.Now;

TimeSpan conversionTime = conversionEnd.Subtract(conversionBegin);
Console.WriteLine("Conversion time: " + conversionTime.TotalMilliseconds + " ms");