mirror of
https://github.com/UglyToad/PdfPig.git
synced 2026-03-10 00:23:29 +08:00
also changes pages to use a proper tree structure since this will be required for resource inheritance and for acroform widget dictionaries.
72 lines
2.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|