使用C#中的ZipFile将XPS文件作为ZIP存档进行操作

时间:2017-01-22 00:18:37

标签: c# .net zip xps

我正在尝试从XPS文件的FixedPage条目中删除一些节点。我写了一个方法,按照我想要的方式操作FixedPage的xml,通过从xps中提取* .fpage文件并再次放回来手动测试它。一切似乎都没问题。所以,我开发了一个简单的实用程序来处理xps文件中的每个固定页面:

var arch = ZipFile.Open(xpsFileName, System.IO.Compression.ZipArchiveMode.Update);

foreach (var entry in arch.Entries)
    if (entry.Name.EndsWith(".fpage"))
    {
        var file = entry.Open();

        var page = XElement.Load(file);
        page = ProcessPage(page);

        file.Position = 0;
        page.Save(file);
        file.SetLength(file.Position);

        file.Close();
    }

arch.Dispose();

虽然生成的xps文件保持了zip-archive的完整性,并且可以使用unzip,7zip,windows explorer等解压缩,但是Microsoft XPS Viewer无法显示它,显示一些错误消息("无法打开)这个文件"或类似的东西)。 我很确定该文件应该是有效的xps文件。此外,如果我将其内容重新打包到我之前提到的任何实用程序的新zip文件中,并将其重命名为xps,则可以使用MS XPS查看器查看其内容。 有人能把我推向正确的方向还是告诉我我做错了什么?

1 个答案:

答案 0 :(得分:2)

我没记过xps实际上是一个.net包。我已经通过使用ZipPackage类解决了我的问题:

    using (var pack = ZipPackage.Open(xpsFileName, FileMode.Open, FileAccess.ReadWrite))
    {
        foreach (var part in pack.GetParts()) if (part.Uri.OriginalString.EndsWith(".fpage"))
            {
                using (var file = part.GetStream(FileMode.Open, FileAccess.ReadWrite))
                {
                    var page = ProcessPage(XElement.Load(file));
                    file.Position = 0;
                    page.Save(file);
                    file.SetLength(file.Position);
                }
            }
    }