Files
PdfPig/src/UglyToad.PdfPig/Content/Pages.cs
Eliot Jones 2ef45f71d5 make missing acroform types public and start improving data
also changes pages to use a proper tree structure since this will be required for resource inheritance and for acroform widget dictionaries.
2019-10-09 14:28:37 +01:00

72 lines
2.5 KiB
C#

namespace UglyToad.PdfPig.Content
{
using System;
using System.Collections.Generic;
using Tokenization.Scanner;
using Tokens;
using Util;
internal class Pages
{
private readonly Catalog catalog;
private readonly IPageFactory pageFactory;
private readonly bool isLenientParsing;
private readonly IPdfTokenScanner pdfScanner;
public int Count { get; }
internal Pages(Catalog catalog, IPageFactory pageFactory, bool isLenientParsing,
IPdfTokenScanner pdfScanner)
{
this.catalog = catalog ?? throw new ArgumentNullException(nameof(catalog));
this.pageFactory = pageFactory ?? throw new ArgumentNullException(nameof(pageFactory));
this.isLenientParsing = isLenientParsing;
this.pdfScanner = pdfScanner ?? throw new ArgumentNullException(nameof(pdfScanner));
Count = catalog.PagesDictionary.GetIntOrDefault(NameToken.Count);
}
public Page GetPage(int pageNumber)
{
if (pageNumber <= 0 || pageNumber > Count)
{
throw new ArgumentOutOfRangeException(nameof(pageNumber),
$"Page number {pageNumber} invalid, must be between 1 and {Count}.");
}
var pageNode = catalog.GetPageNode(pageNumber);
var pageStack = new Stack<PageTreeNode>();
var currentNode = pageNode;
while (currentNode != null)
{
pageStack.Push(currentNode);
currentNode = currentNode.Parent;
}
var pageTreeMembers = new PageTreeMembers();
while (pageStack.Count > 0)
{
currentNode = pageStack.Pop();
pageFactory.LoadResources(currentNode.NodeDictionary, isLenientParsing);
if (currentNode.NodeDictionary.TryGet(NameToken.MediaBox, pdfScanner, out ArrayToken mediaBox))
{
pageTreeMembers.MediaBox = new MediaBox(mediaBox.ToRectangle());
}
if (currentNode.NodeDictionary.TryGet(NameToken.Rotate, pdfScanner, out NumericToken rotateToken))
{
pageTreeMembers.Rotation = rotateToken.Int;
}
}
var page = pageFactory.Create(pageNumber, pageNode.NodeDictionary, pageTreeMembers, isLenientParsing);
return page;
}
}
}