mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-10-14 19:05:01 +08:00
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:
@@ -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);
|
||||
|
||||
|
@@ -204,72 +204,64 @@
|
||||
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));
|
||||
Debug.Assert(pageNode.IsPage);
|
||||
|
||||
var pageReferences = new List<IndirectReferenceToken>();
|
||||
foreach (var pageNode in treeNode.Children)
|
||||
var pageDictionary = new Dictionary<NameToken, IToken>
|
||||
{
|
||||
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 }
|
||||
});
|
||||
{NameToken.Parent, parentPagesObject},
|
||||
};
|
||||
|
||||
var pagesRef = Context.WriteObject(Memory, pagesDictionary);
|
||||
pageReferences.Add(new IndirectReferenceToken(pagesRef.Number));
|
||||
foreach (var setPair in pageNode.NodeDictionary.Data)
|
||||
{
|
||||
var name = setPair.Key;
|
||||
var token = setPair.Value;
|
||||
|
||||
if (name == NameToken.Parent)
|
||||
{
|
||||
// Skip Parent token, since we have to reassign it
|
||||
continue;
|
||||
}
|
||||
|
||||
var pageDictionary = new Dictionary<NameToken, IToken>
|
||||
{
|
||||
{NameToken.Parent, parentIndirect},
|
||||
};
|
||||
|
||||
foreach(var setPair in pageNode.NodeDictionary.Data)
|
||||
{
|
||||
var name = setPair.Key;
|
||||
var token = setPair.Value;
|
||||
|
||||
if (name == NameToken.Parent)
|
||||
{
|
||||
// Skip Parent token, since we have to reassign it
|
||||
continue;
|
||||
}
|
||||
|
||||
pageDictionary.Add(NameToken.Create(name), CopyToken(token, tokenScanner));
|
||||
}
|
||||
|
||||
var pageRef = Context.WriteObject(Memory, new DictionaryToken(pageDictionary), reserved);
|
||||
pageReferences.Add(new IndirectReferenceToken(pageRef.Number));
|
||||
pageDictionary.Add(NameToken.Create(name), CopyToken(token, tokenScanner));
|
||||
}
|
||||
|
||||
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;
|
||||
|
Reference in New Issue
Block a user