我正在尝试从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查看器查看其内容。 有人能把我推向正确的方向还是告诉我我做错了什么?
答案 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);
}
}
}