Appending an XPS document to an existing one

一曲冷凌霜 提交于 2019-12-08 05:16:12

问题


Guys, here's where I am stuck.

I have a need to create a single XPS file from a huge bunch of tiny XPS files. The problem is that I keep running out of memory when I try to do this.

I present below the code (taken from MSDN), but essentially all it does is this:

  1. It reads each tiny XPS file
  2. Extracts the pages from it.
  3. Adds these pages to a FixedDocumentSequence.
  4. When all docs are done, it writes this sequence out to the combined XPS doc.

IMO, my FixedDocumentSequence is getting too big. So, I am thinking, that maybe I can do this piece by piece - i.e. append the tiny XPS docs to the combined XPS docs one by one.

Now, I don't know how to do that. Any pointers?

Code:

            //Create new xps package
            Package combinedXPS = Package.Open(filename, FileMode.Create);
            XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(new XpsDocument(combinedXPS));

            FixedDocumentSequence combinedSequence = new FixedDocumentSequence();

            //Go through each file given
            foreach (string file in filenames)
            {
                //Load Xps Package
                XpsDocument singleXPS = new XpsDocument(file, FileAccess.Read);
                FixedDocumentSequence singleSequence = singleXPS.GetFixedDocumentSequence();

                //Go through each document in the file
                foreach (DocumentReference docRef in singleSequence.References)
                {
                    FixedDocument oldDoc = docRef.GetDocument(false);
                    FixedDocument newDoc = new FixedDocument();
                    DocumentReference newDocReference = new DocumentReference();

                    newDocReference.SetDocument(newDoc);

                    //Go through each page
                    foreach (PageContent page in oldDoc.Pages)
                    {
                        PageContent newPage = new PageContent();
                        newPage.Source = page.Source;
                        (newPage as IUriContext).BaseUri = ((IUriContext)page).BaseUri;
                        newPage.GetPageRoot(true);
                        newDoc.Pages.Add(newPage);
                    }

                    //Add the document to package
                    combinedSequence.References.Add(newDocReference);
                }
                singleXPS.Close();
            }

            xpsWriter.Write(combinedSequence);
            combinedXPS.Close();

回答1:


XPS documents are just zipped up XAML files, I bet you could just directly write out an XML from all of the source files without keeping it all in memory, then zip it up. There's even .NET APIs that help you deal with these kinds of files directly.



来源:https://stackoverflow.com/questions/5320990/appending-an-xps-document-to-an-existing-one

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!