3

我需要拆分现有的 XPS 文档并创建一个新的 XPS 文档,其中只有一页原始文档。我试图复制文档并从复制的文档中删除页面,但这非常慢。有没有更有效的方法来做到这一点?请在 C# 中。

谢谢。

解决:

public void Split(string originalDocument, string detinationDocument)
    {
        using (Package package = Package.Open(originalDocument, FileMode.Open, FileAccess.Read))
        {
            using (Package packageDest = Package.Open(detinationDocument))
            {
                string inMemoryPackageName = "memorystream://miXps.xps";
                 Uri packageUri = new Uri(inMemoryPackageName);
                 PackageStore.AddPackage(packageUri, package);
                XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName);
                XpsDocument xpsDocumentDest = new XpsDocument(packageDest, CompressionOption.Normal, detinationDocument);
                var fixedDocumentSequence = xpsDocument.GetFixedDocumentSequence();
                DocumentReference docReference = xpsDocument.GetFixedDocumentSequence().References.First();
                FixedDocument doc = docReference.GetDocument(false);
                var content = doc.Pages[2];
                var fixedPage = content.GetPageRoot(false);
                var writter = XpsDocument.CreateXpsDocumentWriter(xpsDocumentDest);
                writter.Write(fixedPage);
                xpsDocumentDest.Close();
                xpsDocument.Close();
            }
        }
    }
4

2 回答 2

8
  1. 打开 XpsDocument
  2. 创建目标 XpsDocument(方法相同)
  3. 从第一个 XpsDocument 中获取 FixedDocumentSequce
  4. 从序列中获取第一个 FixedDocument。
  5. Pages 属性中获取第一个PageContent
  6. 从PageContent的Child 属性中获取 FixedPage
  7. 从第二个 XpsDocument 获取 XpsDocumentWriter
  8. 编写固定页面

简单的。


正如Christopher Currens所指出的,可能需要使用PageContent.GetPageRoot而不是Child在步骤 6 中使用。

于 2011-03-16T16:55:10.643 回答
1

谢谢,它可以帮助很多人寻找解决 Xps 打印限制的方法,该限制忽略了在页面级别定义的 PrintTicket。

https://connect.microsoft.com/VisualStudio/feedback/details/529120/printqueue-addjob-ignores-printtickets-in-xps-documents

于 2011-11-22T16:44:36.520 回答