Merging xps documents make last one duplicate
.net, c#, wpf, xps, xpsdocument
Solution
I created following function and it works for me.
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();
}
Problem
I have problem when merging multiple XPS documents into one. When I merge them, the result xps contains last XPS document that duplicated. Here is my function to merge (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; } ``` the result goes to DocumentViewer and display it to user.