在C#中将Office文档的ByteArray转换为PDF的ByteArray

Convert ByteArray of Office document to ByteArray of PDF in C#

如果安装了 Office 并且 Microsoft.Office.Interop被使用了?

我从数据库中获取文件的 byteArray 及其名称。 我想先将每个文件转换为 PDF,然后使用 PDFSharp(这部分已经实现)将所有 PDF 合并为一个 PDF。

代码:

 foreach (Entity en in res.Entities)
 {
    byte[] fileByteArray = Convert.FromBase64String(en.GetAttributeValue<string>("documentbody"));
    string fileName = en.GetAttributeValue<string>("filename");
    string extension = fileName.Split('.')[1];
                            
    switch(extension)
    {
      case "doc":
      case "docx":
        byteArr.Add(ConvertWordToPdf(fileName, fileByteArray)); break;
      case "xlsx":
        byteArr.Add(ConvertExcelToPdf(fileName, fileByteArray)); break;
    }
 }

问题是我不太确定如何实现这两种方法。 我尝试使用以下代码:

 private byte[] ConvertWordToPdf(string fileName, byte[] fileByteArray)
    {
        string tmpFile = Path.GetTempFileName();
        File.WriteAllBytes(tmpFile, fileByteArray);

        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();

        Document doc = app.Documents.Open(tmpFile);

        // Save Word doc into a PDF
        string pdfPath = fileName.Split('.')[0] + ".pdf";
        doc.SaveAs2(pdfPath, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF);

        doc.Close();
        app.Quit();

        byte[] pdfFileBytes = File.ReadAllBytes(pdfPath);
        File.Delete(tmpFile);
        return pdfFileBytes;
    }

但它会将文件保存到磁盘,这是我想避免的事情。是否可以在不保存到磁盘的情况下执行相同的操作?

如果您查看 Documents.Open 的文档,则没有提及直接从流中打开文档。不幸的是,这是图书馆中普遍存在的问题。但是您可能还可以使用其他允许此操作的库。

我认为保存到文件不会成为主要的性能问题,因为转换可能是主要因素。但如果您的程序 运行 在非常受限的环境中,它可能会导致权限问题。

如果保留文件保存方法,则应添加一些异常处理,以确保即使发生异常也能删除临时文件。我还看到外部程序在一段时间后释放文件锁的问题,因此尝试多次删除文件可能会有用。