#region PDFsharp - A .NET library for processing PDF // // Authors: // Stefan Lange // // Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany) // // http://www.pdfsharp.com // http://sourceforge.net/projects/pdfsharp // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; using System.Diagnostics; namespace PdfSharp.Pdf.Advanced { /// /// Represents a PDF cross-reference stream. /// internal sealed class PdfCrossReferenceStream : PdfTrailer // Reference: 3.4.7 Cross-Reference Streams / Page 106 { /// /// Initializes a new instance of the class. /// public PdfCrossReferenceStream(PdfDocument document) : base(document) { #if DEBUG && CORE if (Internal.PdfDiagnostics.TraceXrefStreams) { Debug.WriteLine("PdfCrossReferenceStream created."); } #endif } public readonly List Entries = new List(); public struct CrossReferenceStreamEntry { // Reference: TABLE 3.16 Entries in a cross-reference stream / Page 109 public uint Type; // 0, 1, or 2. public uint Field2; public uint Field3; } /// /// Predefined keys for cross-reference dictionaries. /// public new class Keys : PdfTrailer.Keys // Reference: TABLE 3.15 Additional entries specific to a cross-reference stream dictionary / Page 107 { /// /// (Required) The type of PDF object that this dictionary describes; /// must be XRef for a cross-reference stream. /// [KeyInfo(KeyType.Name | KeyType.Required, FixedValue = "XRef")] public const string Type = "/Type"; /// /// (Required) The number one greater than the highest object number /// used in this section or in any section for which this is an update. /// It is equivalent to the Size entry in a trailer dictionary. /// [KeyInfo(KeyType.Integer | KeyType.Required)] public new const string Size = "/Size"; /// /// (Optional) An array containing a pair of integers for each subsection in this section. /// The first integer is the first object number in the subsection; the second integer /// is the number of entries in the subsection. /// The array is sorted in ascending order by object number. Subsections cannot overlap; /// an object number may have at most one entry in a section. /// Default value: [0 Size]. /// [KeyInfo(KeyType.Array | KeyType.Optional)] public const string Index = "/Index"; /// /// (Present only if the file has more than one cross-reference stream; not meaningful in /// hybrid-reference files) The byte offset from the beginning of the file to the beginning /// of the previous cross-reference stream. This entry has the same function as the Prev /// entry in the trailer dictionary. /// [KeyInfo(KeyType.Integer | KeyType.Optional)] public new const string Prev = "/Prev"; /// /// (Required) An array of integers representing the size of the fields in a single /// cross-reference entry. The table describes the types of entries and their fields. /// For PDF 1.5, W always contains three integers; the value of each integer is the /// number of bytes (in the decoded stream) of the corresponding field. For example, /// [1 2 1] means that the fields are one byte, two bytes, and one byte, respectively. /// /// A value of zero for an element in the W array indicates that the corresponding field /// is not present in the stream, and the default value is used, if there is one. If the /// first element is zero, the type field is not present, and it defaults to type 1. /// /// The sum of the items is the total length of each entry; it can be used with the /// Indexarray to determine the starting position of each subsection. /// /// Note: Different cross-reference streams in a PDF file may use different values for W. /// /// Entries in a cross-reference stream. /// /// TYPE FIELD DESCRIPTION /// 0 1 The type of this entry, which must be 0. Type 0 entries define the linked list of free objects (corresponding to f entries in a cross-reference table). /// 2 The object number of the next free object. /// 3 The generation number to use if this object number is used again. /// 1 1 The type of this entry, which must be 1. Type 1 entries define objects that are in use but are not compressed (corresponding to n entries in a cross-reference table). /// 2 The byte offset of the object, starting from the beginning of the file. /// 3 The generation number of the object. Default value: 0. /// 2 1 The type of this entry, which must be 2. Type 2 entries define compressed objects. /// 2 The object number of the object stream in which this object is stored. (The generation number of the object stream is implicitly 0.) /// 3 The index of this object within the object stream. /// [KeyInfo(KeyType.Array | KeyType.Required)] public const string W = "/W"; /// /// Gets the KeysMeta for these keys. /// public static new DictionaryMeta Meta { get { return _meta ?? (_meta = CreateMeta(typeof(Keys))); } } static DictionaryMeta _meta; } /// /// Gets the KeysMeta of this dictionary type. /// internal override DictionaryMeta Meta { get { return Keys.Meta; } } } }