使用openXML或类似工具将docx (bytes[]格式)转换为pdf (bytes[]格式)

本文关键字:格式 bytes openXML 转换 pdf docx 使用 工具 | 更新日期: 2023-09-27 18:14:06

我现在有一个函数,可以使用Microsoft.Office.Interop.Word将docx(bytes[]格式)转换为pdf(bytes[]格式)

效果很好。除了它不能在线工作,因为它需要在服务器上安装WinOffice,而我对此无能为力。

所以我需要去别的东西,我正在考虑openXML(除非你知道任何更好的方法)。

但是我该如何绕过这个呢?我只是想把这个docx文件,转换并返回为字节[]格式的pdf。

我以前在微软的代码。办公室是这样的

public static byte[] ConvertDocx2PDF(byte[] DocxFile, string FileName)
{
    try
    {
        string path = Path.Combine(HttpRuntime.AppDomainAppPath, "MailFiles/DOCX2PDF");
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        Guid id = Guid.NewGuid();
        FileName = id.ToString() + FileName;
        path += "/" + FileName;

        if (File.Exists(path))
            File.Delete(path);
        File.WriteAllBytes(path, DocxFile);
        Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
        object oMissing = System.Reflection.Missing.Value;
        word.Visible = false;
        word.ScreenUpdating = false;
        // Cast as Object for word Open method
        Object filename = (Object)path;
        // Use the dummy value as a placeholder for optional arguments
        Microsoft.Office.Interop.Word.Document doc = word.Documents.Open(ref filename, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing);
        doc.Activate();
        object outputFileName = (object)path.ToLower().Replace(".docx", ".pdf");
        object fileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;
        if (File.Exists(outputFileName.ToString()))
            File.Delete(outputFileName.ToString());
        // Save document into PDF Format
        doc.SaveAs(ref outputFileName,
            ref fileFormat, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing);
        object saveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
        ((Microsoft.Office.Interop.Word._Document)doc).Close(ref saveChanges, ref oMissing, ref oMissing);
        doc = null;
        ((Microsoft.Office.Interop.Word._Application)word).Quit(ref oMissing, ref oMissing, ref oMissing);
        word = null;
        try
        {
            File.Delete(path);
        }
        catch { }
        return File.ReadAllBytes(path.ToLower().Replace(".docx", ".pdf"));
    }
    catch (Exception e)
    {
    }
    byte[] erroByte = new byte[0];
    return erroByte;
}

说。它工作得很好,但在我的服务器上不起作用。

任何想法如何做到这一点在openXML或其他?

感谢您的宝贵时间

使用openXML或类似工具将docx (bytes[]格式)转换为pdf (bytes[]格式)

您可以使用OpenXmlSdk和OpenXML功能工具将docx转换为html,然后您可以将html转换为pdf。这里不需要互操作。最后,您可以使用WkHtmlToPDF作为dll从Html创建pdf。pdf在web浏览器中的呈现。

链接:

openxmldocx到Html

使用XSLT将Docx转换为Html

希望这对你有帮助!

docx是文档描述格式,而您可以将PDF视为矢量图形格式。尽管它非常努力地伪装成文档格式,但它本质上是一种图形格式。

这是什么意思?这意味着正确的转换需要呈现文档。基本上,你必须重新实现MS Word的核心部分,使其可靠。

我想有一些库是存在的,但它会比你买一个服务器要贵得多,你可以在那里安装一个Word副本。

但是毕竟,OpenOffice 可以渲染word文档,所以也许有人可以尝试将它嵌入到一个(庞大的)库中…

编辑:实际上,我找到了这个答案,这可能有帮助,但它说它需要安装OpenOffice。也许它可以与xcopy的OOo一起工作,您可以尝试一下。