みんな、ここで私は立ち往生しています。
大量の小さな XPS ファイルから 1 つの XPS ファイルを作成する必要があります。問題は、これを実行しようとするとメモリが不足し続けることです。
コードの下に提示します (MSDN から取得) が、基本的にはこれだけです。
- 小さなXPSファイルをそれぞれ読み取ります
- そこからページを抽出します。
- これらのページを FixedDocumentSequence に追加します。
- すべてのドキュメントが完了すると、このシーケンスが結合された 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();