在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 的文档,则没有提及直接从流中打开文档。不幸的是,这是图书馆中普遍存在的问题。但是您可能还可以使用其他允许此操作的库。
我认为保存到文件不会成为主要的性能问题,因为转换可能是主要因素。但如果您的程序 运行 在非常受限的环境中,它可能会导致权限问题。
如果保留文件保存方法,则应添加一些异常处理,以确保即使发生异常也能删除临时文件。我还看到外部程序在一段时间后释放文件锁的问题,因此尝试多次删除文件可能会有用。
如果安装了 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 的文档,则没有提及直接从流中打开文档。不幸的是,这是图书馆中普遍存在的问题。但是您可能还可以使用其他允许此操作的库。
我认为保存到文件不会成为主要的性能问题,因为转换可能是主要因素。但如果您的程序 运行 在非常受限的环境中,它可能会导致权限问题。
如果保留文件保存方法,则应添加一些异常处理,以确保即使发生异常也能删除临时文件。我还看到外部程序在一段时间后释放文件锁的问题,因此尝试多次删除文件可能会有用。