【问题标题】:Word API: Prevent Conversion of FileWord API:防止文件转换
【发布时间】:2010-07-10 22:15:32
【问题描述】:

我正在使用 Microsoft.Office.Interop.Word 命名空间中的 Documents.Open 方法打开 word 文档。这很好用,除了当我打开一个不是 word 文档的文件时,它会自动转换为 word 文档。我想找到一种方法来引发文档不是word文档的异常,在打开文档之前检测文档是否是word文档,或者检测文档是否在之后转换打开并转换。有人对如何实现这一点有任何想法吗?

【问题讨论】:

    标签: c# ms-word


    【解决方案1】:

    一个简单的测试是在尝试使用 Word 打开文档之前检查文档文件头中的幻数。

    二进制 Word 文档 (.doc) 是复合文档,以 0xcfd0 开头,而 OpenXML 文档 (.docx) 以字符串“PK”开头。

    static bool HasComoundDocumentSignature(string filename)
    {
        using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
        {
            UInt16 magicNumber = br.ReadUInt16();      
            return magicNumber == 0xcfd0;
        }
    }
    
    static bool HasZipSignature(string filename)
    {
        using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
        {
            UInt16 magicNumber = br.ReadUInt16();  
            return magicNumber == 0x4b50;
        }
    }
    
    static bool HasWordSignature(string filename)
    {
        return HasCompoundDocumentSignature(filename) 
            || HasZipSignature(filename); 
    }
    

    【讨论】:

    • 我知道这非常接近,但我不想使用这样的解决方案,因为任何 zip 文件都应该能够通过此测试,因此不一定表明该文件是一个Word文件。我真的在寻找 API 中的一些东西,它可以让我知道打开文件时对文件执行的任何转换。
    • @jcnnghm:是的,当然这不是防弹的。如果您找到一个 zip 文件,您必须打开它并检查 _rels\.rels 文件,并解析该包部分的 XML 以查看它是否包含“schemas.openxmlformats.org/officeDocument/2006/relationships/…”类型的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2022-09-24
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多