WPF在xps文档中查找所有正则表达式匹配项

时间:2014-11-11 13:23:36

标签: wpf xps xpsdocument

我需要在xps document内搜索一个表达式,然后列出所有匹配项(每个匹配项的页码)。

我在谷歌搜索过,但没有找到解决此问题的参考或样本。

SO:如何搜索xps document并获取这些信息?

先谢谢。

2 个答案:

答案 0 :(得分:1)

首先要注意的是XPS文件是Open Packaging包。它可以打开,并通过System.IO.Packaging.Package类访问内容。这使得对内容的任何操作都更容易。

以下是如何使用给定的正则表达式搜索页面内容,同时还跟踪匹配发生在哪个页面的示例。

var regex = new Regex(@"th\w+", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);

using(var xps = System.IO.Packaging.Package.Open(@"C:\path\to\regex.oxps"))
{
    var pages = xps.GetParts()
        .Where (p => p.ContentType == "application/vnd.ms-package.xps-fixedpage+xml")
        .ToList();

    for (var i = 0; i < pages.Count; i++)
    {
        var page = pages[i];
        using(var reader = new StreamReader(page.GetStream()))
        {
            var s = reader.ReadToEnd();
            var matches = regex.Matches(s);

            if (matches.Count > 0)
            {
                var matchText = matches
                    .Cast<Match>()
                    .Aggregate (new StringBuilder(), (agg, m) => agg.AppendFormat("{0} ", m.Value));
                Console.WriteLine("Found matches on page {0}: {1}", i + 1, matchText);
            }
        }
    }
}

答案 1 :(得分:0)

这不会像你想象的那么简单。 XPS文件是压缩(压缩)文件,包含一些包含所有文本,字体,图形和其他项目的复杂文件夹结构。您可以使用压缩工具(如7-Zip或WinZip等)从XPS文件中提取整个文件夹结构。

话虽如此,您可以使用以下一系列步骤来执行您想要的操作:

  1. 以编程方式在临时文件夹中提取XPS文件的内容。如果您使用的是.NET 4.5或更高版本,则可以将新ZipFile class用于此目的。

  2. 解压缩的文件夹将具有以下文件夹结构:

    • _rels
    • 文档
      • 1
        • _rels
        • 元数据
          • _rels
        • 资源
          • 字体
    • 元数据

    转到Documents\1\Pages\子文件夹。在这里,您可以找到一个或多个.fpage个文件,每个文件对应一个文件。这些文件采用XML格式,并以结构化方式包含页面中包含的所有文本。

  3. 使用简单循环遍历所有.fpage文件,使用XML读取器(如XDocument或XmlDocument)打开每个文件,并使用RegEx.IsMatch()在节点值中搜索所需文本。如果找到,请记下列表中的页码并继续前进。

相关问题