Добавление документа XPS к существующему

Ребята, вот где я застрял.

Мне нужно создать один файл XPS из огромного количества крошечных файлов XPS. Проблема в том, что мне постоянно не хватает памяти, когда я пытаюсь это сделать.

Ниже я привожу код (взятый из MSDN), но по сути все, что он делает, это:

  1. Он читает каждый крошечный файл XPS
  2. Извлекает из него страницы.
  3. Добавляет эти страницы в FixedDocumentSequence.
  4. Когда все документы готовы, эта последовательность записывается в объединенный документ XPS.

ИМО, моя 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();

person Vaibhav    schedule 16.03.2011    source источник
comment
Можете ли вы прокомментировать, почему у вас много крошечных XPS-файлов?   -  person Rafael Rivera    schedule 16.03.2011
comment
Будет ли работать использование FileMode.Append вместо FileMode.Create и открытие/закрытие комбинированного XPS для каждого файла?   -  person yoozer8    schedule 13.10.2011


Ответы (1)


XPS-документы — это просто заархивированные XAML-файлы. Бьюсь об заклад, вы могли бы просто напрямую записать XML из всех исходных файлов, не сохраняя их все в памяти, а затем заархивируйте их. Существуют даже API-интерфейсы .NET, которые помогают напрямую работать с такими файлами.

person Ana Betts    schedule 16.03.2011
comment
К сожалению - это не так тривиально. И да, я знаю о .Net API. Это то, что я использую в коде, который я вставил. - person Vaibhav; 16.03.2011
comment
Я имею в виду .NET API для стандарта OPC. - person Ana Betts; 16.03.2011
comment
Судя по вашему описанию выше, это это тривиально. Прочитайте несколько XML-файлов, добавьте их все в другой XML-файл. В вашем описании что-то упущено? - person Ana Betts; 16.03.2011
comment
Ах - попался на API на OPC - будем разбираться. Но не уверен, почему вы думаете, что это просто чтение некоторых файлов XML. Ресурсы из всех меньших XPS-документов тоже придется объединить, не так ли? - person Vaibhav; 16.03.2011
comment
Пол прав, похоже, все, что вам нужно сделать, это итеративно а) разархивировать XPS и б) вытащить XAML в .xps\Documents\n\Pages\n.fpage. Склеить все вместе и вуаля? (Непроверенный, YMMV) - person Rafael Rivera; 16.03.2011
comment
@Vaibhav Ах, вы правы, это немного сложнее, чем с изображениями, но не должно быть слишком обременительным. - person Ana Betts; 16.03.2011