2

I need to search an expression inside a xps document then list all matches (with the page number of each match).

I searched in google, but no reference or sample found which addresses this issue .

SO: How can I search a xps document and get this information?

4

2 回答 2

1

首先要注意的是,XPS 文件是一个开放打包包。它可以打开并通过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);
            }
        }
    }
}
于 2014-11-15T11:35:28.373 回答
0

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

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

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

  2. 提取的文件夹将具有以下文件夹结构:

    • _rels
    • 文件
      • 1
        • _rels
        • 元数据
        • 页面
          • _rels
        • 资源
          • 字体
    • 元数据

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

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

于 2014-11-15T11:43:10.503 回答