Word Interop - 你能判断一个Word文档的byte []数组是否是HTML?

时间:2016-10-14 17:47:26

标签: c# html ms-word office-interop

我正在使用代码库,简而言之,它负责在基于Web的查看器中显示文档,并为每个页码提供缩略图。按文档类型分隔加载策略和计算文档中的页数,并将文档转换为通用格式进行表示。

我正在处理的问题涉及某些Word文档的初始页数计算。这些文档存储在第三方数据库中,该数据库除了其他之外还提供文档的二进制流和扩展名(总是' doc')。要计算文档的页数,我们使用Microsoft Office Interop,如下所示:

    public int GetPageCount(byte[] file)
    {
        var filePath = Path.GetTempFileName();
        File.WriteAllBytes(filePath, file);

        return this.GetPageCount(filePath);
    }

    public int GetPageCount(string filePath)
    {
        try
        {
            this.OpenDocument(filePath);
            const WdStatistic statistic = Microsoft.Office.Interop.Word.WdStatistic.wdStatisticPages;
            var pages = Document.ComputeStatistics(statistic, Type.Missing);

            return pages;
        }
        finally
        {
            //Closes handles, removes temp files, implementation omitted for brevity
            this.DisposeDocument();
            this.DisposeApplication();
        }
    }

    private void OpenDocument(string filePath)
    {
        // Create a new Microsoft Word application object
        this.Word = new Application();
        this.Word.Visible = false;
        this.Word.ScreenUpdating = false;

        object refFilePath = filePath;

        object html  = WdOpenFormat.wdOpenFormatWebPages;

        this.Document = this.Word.Documents.Open(ref refFilePath, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing, ref this.missing);

        if (Document == null)
        {
            throw new Exception(string.Format("Could not open Word document ({0})", filePath));
        }
    }

此代码处理的大多数文档都是正常的Word文档,可以正常工作。但是,其中一些文档实际上是保存为Word文档的HTML文档,不幸的是,使用wdstatisticpages的这段代码错误地推断出这些文档只有1页。我不确定现有代码中是否缺少某些东西,这些代码将使Interop库的交互能够正确地确定HTML的页数,这似乎是最简单的选择。

作为替代方案,我考虑是否可以确定字节数组是否可以解析为HTML;我们有一个针对.html文件的渲染策略,但由于' doc'策略是从数据库中推断出来的。将HTML文档的二进制文件转换为字符串为我们提供了原始HTML,我想知道是否像正则表达式或一些第三方库那样聪明的东西可能是可行的。我也没有遇到任何麻烦,但我想知道.NET中是否有一些优雅的东西可以做得更好一些。如果.NET本机可用,那么不引入依赖关系或依赖正则表达式会很好。类似的东西:

    public bool IsHtml(byte[] file)
    {
        var fileString = Encoding.UTF8.GetString(file); 
        //Validate the fileString; how do we determine that the GetString() method correctly parsed and is not garbage?
        //return answer
    }

我应该指出,另一种选择是让第三方数据库的供应商更改其数据更正确,例如商店' html'作为其延伸。但是,我好奇的鞋底想知道处理代码中的差异是否真的可行且足够干净以备考虑。我在StackOverflow上做了一些研究和搜索,但是找不到与此查询相关的任何内容。

感谢您的帮助和想法。如果您想了解更多信息或详细信息,请询问。

1 个答案:

答案 0 :(得分:0)

理论上你应该能够尝试使用XDocument.Load()的重载来尝试将文件加载到xml对象中,因为HTML是xml,假设它是有效的html。

实际上大多数xml类都可以用来试图解决这个问题,特别是如果你已经有了字符串,你只需要假设无效的xml意味着它实际上是一个单词doc。

编辑:废话现在意识到更新的单词格式也是XML所以这可能不会工作....但是我相信使用HtmlAgilityPack你可以使用类似的想法来解决这个问题

另请参阅此主题以获取有关各种第三方和.net技巧的一些想法,这可能会有所帮助 - > What is the best way to parse html in C#?