在 C# 中编辑 XPS 打印假脱机文件(.SPL 扩展名)(另存为 Zip 问题)

Editing XPS Print Spool Files(.SPL Extension) in C# (Saving as Zip Problem)

当有人打印文档(使用 XPS 打印路径)时,我想暂停打印作业并编辑 SPL(压缩 XPS 格式)文件。

如果我用 7zip 编辑文件并保存。如果我恢复文档打印没有任何问题的工作。

如果我使用 System.IO.Compression.ZipFile class 或 DotNetZip 库或 SevenZipSharp 库打开 SPL 文件并从 SPL 文件中提取文件并从 SPL 文件中删除该文件并再次将该文件添加到 SPL 文件中生成完美的 zip 容器。我比较了原始 SPL 文件和使用 7zip、zipinfo、winrar 工具编辑的 SPL 文件,没有发现任何差异。容器中的所有文件都完全相同。我还检查了 CRC。

当我打开、编辑和保存 zip 文件时,我没有改变任何关于压缩方法、压缩级别等的内容。正如我所说,两个 zip 文件看起来完全一样,但如果我计算原始和编辑的 CRC SPL 文件,它们不一样。

在我编辑之后(只是提取一个页面文件,将其从容器中删除并再次添加到容器中)如果我尝试恢复打印作业,我在事件查看器中看到有关 PrintProcessor 的错误并且我无法打印它。

我无法弄清楚在我编辑文件后发生了什么变化(没有改变容器中的任何东西)。我要疯了。

SPL文件的Zip格式有规范吗?

问题解决如果我使用"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);
                }
            }
    }