Fix an issue where the root/Pages Count was incorrect

`/Pages` Count should reflect the number leaf nodes (page objects) that are descendants of this node.
This commit is contained in:
InusualZ
2020-03-07 12:32:24 -04:00
committed by Eliot Jones
parent 439dad9f35
commit ab3779e644
2 changed files with 37 additions and 6 deletions

View File

@@ -139,6 +139,8 @@
private decimal currentVersion = DefaultVersion;
private MemoryStream memory = new MemoryStream();
private int pageCount = 0;
public DocumentMerger()
{
var reserved = context.ReserveNumber();
@@ -156,7 +158,8 @@
currentVersion = Math.Max(version, currentVersion);
var pagesReference = CopyPagesTree(documentCatalog.PageTree, rootPagesIndirectReference, tokenScanner);
var (pagesReference, count) = CopyPagesTree(documentCatalog.PageTree, rootPagesIndirectReference, tokenScanner);
pageCount += count;
documentPages.Add(new IndirectReferenceToken(pagesReference.Number));
}
@@ -176,7 +179,7 @@
{
{ NameToken.Type, NameToken.Pages },
{ NameToken.Kids, new ArrayToken(documentPages) },
{ NameToken.Count, new NumericToken(documentPages.Count) }
{ NameToken.Count, new NumericToken(pageCount) }
});
var pagesRef = context.WriteObject(memory, pagesDictionary, (int)rootPagesIndirectReference.Data.ObjectNumber);
@@ -210,7 +213,7 @@
memory = null;
}
private ObjectToken CopyPagesTree(PageTreeNode treeNode, IndirectReferenceToken treeParentReference, IPdfTokenScanner tokenScanner)
private (ObjectToken, int) CopyPagesTree(PageTreeNode treeNode, IndirectReferenceToken treeParentReference, IPdfTokenScanner tokenScanner)
{
Debug.Assert(!treeNode.IsPage);
@@ -218,16 +221,20 @@
var currentNodeReference = new IndirectReferenceToken(new IndirectReference(currentNodeReserved, 0));
var pageReferences = new List<IndirectReferenceToken>();
var nodeCount = 0;
foreach (var pageNode in treeNode.Children)
{
ObjectToken newEntry;
if (!pageNode.IsPage)
{
newEntry = CopyPagesTree(pageNode, currentNodeReference, tokenScanner);
var count = 0;
(newEntry, count) = CopyPagesTree(pageNode, currentNodeReference, tokenScanner);
nodeCount += count;
}
else
{
newEntry = CopyPageNode(pageNode, currentNodeReference, tokenScanner);
++nodeCount;
}
pageReferences.Add(new IndirectReferenceToken(newEntry.Number));
@@ -237,7 +244,7 @@
{
{ NameToken.Type, NameToken.Pages },
{ NameToken.Kids, new ArrayToken(pageReferences) },
{ NameToken.Count, new NumericToken(pageReferences.Count) },
{ NameToken.Count, new NumericToken(nodeCount) },
{ NameToken.Parent, treeParentReference }
};
@@ -253,7 +260,7 @@
var pagesDictionary = new DictionaryToken(newPagesNode);
return context.WriteObject(memory, pagesDictionary, currentNodeReserved);
return (context.WriteObject(memory, pagesDictionary, currentNodeReserved), nodeCount);
}
private ObjectToken CopyPageNode(PageTreeNode pageNode, IndirectReferenceToken parentPagesObject, IPdfTokenScanner tokenScanner)