1

みんな、ここで私は立ち往生しています。

大量の小さな XPS ファイルから 1 つの XPS ファイルを作成する必要があります。問題は、これを実行しようとするとメモリが不足し続けることです。

コードの下に提示します (MSDN から取得) が、基本的にはこれだけです。

  1. 小さなXPSファイルをそれぞれ読み取ります
  2. そこからページを抽出します。
  3. これらのページを FixedDocumentSequence に追加します。
  4. すべてのドキュメントが完了すると、このシーケンスが結合された XPS ドキュメントに書き込まれます。

IMO、FixedDocumentSequence が大きくなりすぎています。だから、私はおそらくこれを少しずつ行うことができると考えています。つまり、小さなXPSドキュメントを結合されたXPSドキュメントに1つずつ追加します。

今、私はそれを行う方法がわかりません。ポインタはありますか?

コード:

            //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 ファイルをzip 圧縮しただけです。すべてのソース ファイルから XML を直接書き出すだけで、すべてをメモリに保持せずに圧縮できます。この種のファイルを直接処理するのに役立つ .NET API もあります。

于 2011-03-16T04:56:38.997 に答える