c# - 合并 xps 文档使最后一个重复

标签 c# .net wpf xps xpsdocument

我在将多个 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 并显示给用户。

最佳答案

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

    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();
    }

关于c# - 合并 xps 文档使最后一个重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10672456/

相关文章:

c# - .NET 中包关系的目的是什么?

c# - 在 WPF 中询问窗口是否打开的正确方法

c# - 如何在 WPF 中刷新 DataGrid

c# - 如何使用反射调用泛型方法?

c# - 列出每个对象在 System.Runtime.Caching 内存缓存中占用的大小 c#

尝试使用 conn.Open() 时 C# MySQL SSL 连接错误

.net - 将RTF文件从资源加载到WPF应用程序中的RichTextBox中

javascript - Daypilot C# 获取选定的日期

c# - CS0053错误问题

c# - ASP.NET MVC + Unity 2.0 : lazy loading dependency properties?