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

Manipulating XPS-file as ZIP-archive using ZipFile in C#

我正在尝试从 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 存档的完整性,并且可以使用 unzip、7zip、windows 资源管理器等解压缩,但 Microsoft XPS 查看器无法显示它,并显示一些错误消息 ("could not open this document" 或类似的东西)。 我很确定该文件应该是有效的 xps 文件。此外,如果我使用我之前提到的任何实用程序将其内容重新打包到一个新的 zip 文件中,并将其重命名为 xps,则可以使用 MS XPS 查看器查看其内容。 谁能把我推向正确的方向或告诉我我做错了什么?

我没想到 xps 实际上是一个 .net 包。我已经使用 ZipPackage class:

解决了我的问题
    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);
                }
            }
    }