namespace UglyToad.PdfPig.Content { using System; using System.Collections.Generic; using Core; using Filters; using Graphics; using Graphics.Operations; using Tokenization.Scanner; using XObjects; /// /// Wraps content parsed from a page content stream for access. /// /// /// This should contain a replayable stack of drawing instructions for page content /// from a content stream in addition to lazily evaluated state such as text on the page or images. /// internal class PageContent { private readonly IReadOnlyList> images; private readonly IReadOnlyList markedContents; private readonly IPdfTokenScanner pdfScanner; private readonly IFilterProvider filterProvider; private readonly IResourceStore resourceStore; internal IReadOnlyList GraphicsStateOperations { get; } public IReadOnlyList Letters { get; } public IReadOnlyList Paths { get; } public int NumberOfImages => images.Count; internal PageContent(IReadOnlyList graphicsStateOperations, IReadOnlyList letters, IReadOnlyList paths, IReadOnlyList> images, IReadOnlyList markedContents, IPdfTokenScanner pdfScanner, IFilterProvider filterProvider, IResourceStore resourceStore) { GraphicsStateOperations = graphicsStateOperations; Letters = letters; Paths = paths; this.images = images; this.markedContents = markedContents; this.pdfScanner = pdfScanner ?? throw new ArgumentNullException(nameof(pdfScanner)); this.filterProvider = filterProvider ?? throw new ArgumentNullException(nameof(filterProvider)); this.resourceStore = resourceStore ?? throw new ArgumentNullException(nameof(resourceStore)); } public IEnumerable GetImages() { foreach (var image in images) { if (image.TryGetFirst(out var xObjectContentRecord)) { yield return XObjectFactory.ReadImage(xObjectContentRecord, pdfScanner, filterProvider, resourceStore); } else if (image.TryGetSecond(out var inlineImage)) { yield return inlineImage; } } } public IReadOnlyList GetMarkedContents() => markedContents; } }