1

伙计们,这就是我卡住的地方。

我需要从一大堆微小的 XPS 文件中创建一个 XPS 文件。问题是当我尝试执行此操作时,我的内存不断不足。

我在下面给出了代码(取自 MSDN),但基本上它所做的只是:

  1. 它读取每个微小的 XPS 文件
  2. 从中提取页面。
  3. 将这些页面添加到 FixedDocumentSequence。
  4. 完成所有文档后,它会将此序列写入组合的 XPS 文档。

IMO,我的 FixedDocumentSequence 变得太大了。所以,我在想,也许我可以一块一块地做这件事——即将微小的 XPS 文档一个接一个地附加到组合的 XPS 文档中。

现在,我不知道该怎么做。任何指针?

代码:

            //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();
4

1 回答 1

2

XPS 文档只是压缩了XAML 文件,我敢打赌,您可以直接从所有源文件中写出 XML,而不将其全部保存在内存中,然后将其压缩。甚至还有 .NET API 可以帮助您直接处理这些类型的文件。

于 2011-03-16T04:56:38.997 回答