转换powerpoint演示文稿(ppt/x)到PDF没有互操作

本文关键字:PDF 互操作 powerpoint 文稿 ppt 转换 | 更新日期: 2023-09-27 18:12:57

我需要使用c#将PowerPoint (ppt/pptx)文件转换为PDF

目前,我正在使用这个代码:

public void PPTXToPDF(string originalPptPath, string pdfPath) {
    // Create COM Objects
    Microsoft.Office.Interop.PowerPoint.Application pptApplication = null;
    Microsoft.Office.Interop.PowerPoint.Presentation pptPresentation = null;
    try {
        object unknownType = Type.Missing;
        //start power point
        pptApplication = new Microsoft.Office.Interop.PowerPoint.Application();
        //open powerpoint document
        pptPresentation = pptApplication.Presentations.Open(originalPptPath,
            Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoTrue,
            Microsoft.Office.Core.MsoTriState.msoFalse);
        // save PowerPoint as PDF
        pptPresentation.ExportAsFixedFormat(pdfPath,
            Microsoft.Office.Interop.PowerPoint.PpFixedFormatType.ppFixedFormatTypePDF,
            Microsoft.Office.Interop.PowerPoint.PpFixedFormatIntent.ppFixedFormatIntentPrint,
            MsoTriState.msoFalse, Microsoft.Office.Interop.PowerPoint.PpPrintHandoutOrder.ppPrintHandoutVerticalFirst,
            Microsoft.Office.Interop.PowerPoint.PpPrintOutputType.ppPrintOutputSlides, MsoTriState.msoFalse, null,
            Microsoft.Office.Interop.PowerPoint.PpPrintRangeType.ppPrintAll, string.Empty, true, true, true,
            true, false, unknownType);
    } finally {
        // Close and release the Document object.
        if (pptPresentation != null) {
            pptPresentation.Close();
            pptPresentation = null;
        }
        // Quit PowerPoint and release the ApplicationClass object.
        if(pptApplication != null) {
            pptApplication.Quit();
            pptApplication = null;
        }
    }
}

这个片段使用了Interop库,它创建了一个PowerPoint应用程序的实例,并以编程方式使用它。

问题是应用程序随机崩溃。有时在finally块中,pptApplication出现null,这意味着应用程序甚至没有打开,有时它说消息过滤器表明应用程序很忙,有时我看到一个题为"导出…"的对话框,其中有一个进度条显示导出进度,然后对话框消失,程序永远挂起,直到我强制关闭它。

应用程序在同一个文件上随机失败:我运行一次,它正常工作,我再运行一次,它正常工作,我再运行一次,它不正常,等等…

我不能有一个应用程序,有时工作,有时失败,所以我的问题是:是否有一个可靠的替代将PowerPoint文件转换为PDF不使用互操作?微软是否提供了一种替代API,可以在不打开PowerPoint实例的情况下完成这些工作?

我现在使用互操作的原因是,如果需要的话,我还必须阅读PowerPoint文件并搜索幻灯片中的形状。

我运行应用程序的电脑是安装了Office的Windows 7电脑。我不能安装其他任何东西,这就是为什么我需要找到一个独立的库。

转换powerpoint演示文稿(ppt/x)到PDF没有互操作

我想到的唯一一种方法是尝试使用libreoffice来完成相同的任务。它具有无头模式(没有UI),可以从命令行调用,如下所示:

"C:'Program Files (x86)'LibreOffice 5'program'soffice.exe" --headless --convert-to pdf:writer_pdf_Export test.pptx

注意,它将立即退出(因为它是为批处理而设计的),但是您可以使用FileSystemWatcher查看输出目录,以及所需的文件何时在那里创建(以及何时能够获得该文件的排他锁)—它完成了。您还可以使用它进行批处理,更多可用选项请查看这里- https://help.libreoffice.org/Common/Starting_the_Software_With_Parameters。我用它进行了一些转换,没有问题。

使用互操作,您可以尝试使用以下方法生成pdf:

我测试过一次输出50个,效果很好。

 _oPresentation.SaveAs(outputFullPath, 
     PowerPoint.PpSaveAsFileType.ppSaveAsPDF, 
     Microsoft.Office.Core.MsoTriState.msoCTrue);

注意:_presentation只是互操作演示实例(Microsoft.Office.Interop.PowerPoint.Presentation)。