Fix for page object having as parent his own object

I decided to move to his own method, the part that create the page node. This allowed me to visualize better, from where I was suppose to get the correct reference.
This commit is contained in:
Inusual
2020-02-24 20:35:58 -04:00
committed by Eliot Jones
parent f485826751
commit 669742b6bd
2 changed files with 46 additions and 51 deletions

View File

@@ -14,8 +14,7 @@
var result = PdfMerger.Merge(one, two);
// FIX: Enable UseLenianParseOff
using (var document = PdfDocument.Open(result/*, ParsingOptions.LenientParsingOff */))
using (var document = PdfDocument.Open(result, ParsingOptions.LenientParsingOff))
{
Assert.Equal(2, document.NumberOfPages);

View File

@@ -204,54 +204,50 @@
throw new ObjectDisposedException("Merger disposed already");
}
/*
* I decided that I want to have an /Pages object for each document's pages. That way I avoided resource name conflict
* But I guess that doesn't matter either way? So that part can be eliminated?
*/
var pageReferences = ConstructPageReferences(newDocument.Catalog.PageTree, tokenScanner);
var pagesReference = CopyPagesTree(newDocument.Catalog.PageTree, RootPagesIndirectReference, tokenScanner);
DocumentPages.Add(new IndirectReferenceToken(pagesReference.Number));
}
private ObjectToken CopyPagesTree(PageTreeNode treeNode, IndirectReferenceToken treeParentReference, IPdfTokenScanner tokenScanner)
{
Debug.Assert(!treeNode.IsPage);
var currentNodeReserved = Context.ReserveNumber();
var currentNodeReference = new IndirectReferenceToken(new IndirectReference(currentNodeReserved, 0));
var pageReferences = new List<IndirectReferenceToken>();
foreach (var pageNode in treeNode.Children)
{
IndirectReference newEntry;
if (!pageNode.IsPage)
newEntry = CopyPagesTree(pageNode, currentNodeReference, tokenScanner).Number;
else
newEntry = CopyPageNode(pageNode, currentNodeReference, tokenScanner).Number;
pageReferences.Add(new IndirectReferenceToken(newEntry));
}
var pagesDictionary = new DictionaryToken(new Dictionary<NameToken, IToken>
{
{ NameToken.Type, NameToken.Pages },
{ NameToken.Kids, new ArrayToken(pageReferences) },
{ NameToken.Count, new NumericToken(pageReferences.Count) },
{ NameToken.Parent, RootPagesIndirectReference }
{ NameToken.Parent, treeParentReference }
});
var pagesRef = Context.WriteObject(Memory, pagesDictionary);
DocumentPages.Add(new IndirectReferenceToken(pagesRef.Number));
return Context.WriteObject(Memory, pagesDictionary, currentNodeReserved);
}
private IReadOnlyList<IndirectReferenceToken> ConstructPageReferences(PageTreeNode treeNode, IPdfTokenScanner tokenScanner)
private ObjectToken CopyPageNode(PageTreeNode pageNode, IndirectReferenceToken parentPagesObject, IPdfTokenScanner tokenScanner)
{
var reserved = Context.ReserveNumber();
var parentIndirect = new IndirectReferenceToken(new IndirectReference(reserved, 0));
var pageReferences = new List<IndirectReferenceToken>();
foreach (var pageNode in treeNode.Children)
{
if (!pageNode.IsPage)
{
var nestedPageReferences = ConstructPageReferences(pageNode, tokenScanner);
var pagesDictionary = new DictionaryToken(new Dictionary<NameToken, IToken>
{
{ NameToken.Type, NameToken.Pages },
{ NameToken.Kids, new ArrayToken(nestedPageReferences) },
{ NameToken.Count, new NumericToken(nestedPageReferences.Count) },
{ NameToken.Parent, parentIndirect }
});
var pagesRef = Context.WriteObject(Memory, pagesDictionary);
pageReferences.Add(new IndirectReferenceToken(pagesRef.Number));
continue;
}
Debug.Assert(pageNode.IsPage);
var pageDictionary = new Dictionary<NameToken, IToken>
{
{NameToken.Parent, parentIndirect},
{NameToken.Parent, parentPagesObject},
};
foreach(var setPair in pageNode.NodeDictionary.Data)
foreach (var setPair in pageNode.NodeDictionary.Data)
{
var name = setPair.Key;
var token = setPair.Value;
@@ -265,11 +261,7 @@
pageDictionary.Add(NameToken.Create(name), CopyToken(token, tokenScanner));
}
var pageRef = Context.WriteObject(Memory, new DictionaryToken(pageDictionary), reserved);
pageReferences.Add(new IndirectReferenceToken(pageRef.Number));
}
return pageReferences;
return Context.WriteObject(Memory, new DictionaryToken(pageDictionary));
}
private IToken CopyToken(IToken tokenToCopy, IPdfTokenScanner tokenScanner)
@@ -307,7 +299,11 @@
var objToken = Context.WriteObject(Memory, newToken);
return new IndirectReferenceToken(objToken.Number);
}
else
else if (tokenToCopy is StreamToken streamToken)
{
return streamToken;
}
else // Non Complex Token - BooleanToken, NumericToken, NameToken, Etc...
{
// TODO: Should we do a deep copy of the token?
return tokenToCopy;