【问题标题】:Merging xps documents make last one duplicate合并 xps 文档使最后一个重复
【发布时间】:2012-05-27 04:45:33
【问题描述】:

将多个 XPS 文档合并为一个时遇到问题。当我合并它们时,结果 xps 包含最后一个重复的 XPS 文档。这是我的合并函数(Modified version of this question):

    public XpsDocument CreateXPSStream(List<XpsDocument> ListToMerge)
    {
        var memoryStream = new MemoryStream();
        Package container = Package.Open(memoryStream, FileMode.Create);
        string pack = "pack://temp.xps"; 
        PackageStore.RemovePackage(new Uri(pack));
        PackageStore.AddPackage(new Uri(pack), container);

        XpsDocument xpsDoc = new XpsDocument(container, CompressionOption.SuperFast, "pack://temp.xps");
        FixedDocumentSequence seqNew = new FixedDocumentSequence();
        foreach (var sourceDocument in ListToMerge)
        {
            FixedDocumentSequence seqOld = sourceDocument.GetFixedDocumentSequence();
            foreach (DocumentReference r in seqOld.References)
            {
                DocumentReference newRef = new DocumentReference();
                ((IUriContext)newRef).BaseUri = ((IUriContext)r).BaseUri;
                newRef.Source = r.Source;
                seqNew.References.Add(newRef);
            }
        }
        XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
        xpsWriter.Write(seqNew);
        //xpsDoc.Close();
        //container.Close();
        return xpsDoc;
    }

结果进入 DocumentViewer 并显示给用户。

【问题讨论】:

    标签: c# .net wpf xps xpsdocument


    【解决方案1】:

    我创建了以下函数,它对我有用。

        public void MergeXpsDocument(string newFile, List<XpsDocument> sourceDocuments)
        {
            if (File.Exists(newFile))
            {
                File.Delete(newFile);
            }
    
            XpsDocument xpsDocument = new XpsDocument(newFile, System.IO.FileAccess.ReadWrite);
            XpsDocumentWriter xpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
            FixedDocumentSequence fixedDocumentSequence = new FixedDocumentSequence();
    
            foreach(XpsDocument doc in sourceDocuments)
            {
                FixedDocumentSequence sourceSequence = doc.GetFixedDocumentSequence();
                foreach (DocumentReference dr in sourceSequence.References)
                {
                    DocumentReference newDocumentReference = new DocumentReference();
                    newDocumentReference.Source = dr.Source;
                    (newDocumentReference as IUriContext).BaseUri = (dr as IUriContext).BaseUri;
                    FixedDocument fd = newDocumentReference.GetDocument(true);
                    newDocumentReference.SetDocument(fd);
                    fixedDocumentSequence.References.Add(newDocumentReference);
                }
            }
            xpsDocumentWriter.Write(fixedDocumentSequence);
            xpsDocument.Close();
        }
    

    【讨论】:

    • 我见过的其他示例从多个源 XPS 文档中提取页面,创建一个新的 XPS 文件,其 FixedDocumentSequence 包含单个 FixedDocument,其中包含源文档中的所有页面。这是我发现的唯一一个将新的 FixedDocument 对象添加到 FixedDocumentSequence 的示例。
    • 工作就像一个魅力。谢谢!
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2011-11-30
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多