/// <summary> /// Attempt to parse a sequence of bytes as a PDF object /// </summary> /// <param name="Data">Bytes to parse</param> /// <param name="EndingIndex">0-based index into data indicating the byte after the last parsed byte</param> /// <param name="StartingIndex">0-based index into data at which to start parsing (default: 0)</param> /// <returns>PDF object successfully parsed from the data, or NULL if no complete object was parsable</returns> public static IPDFObject Parse(byte[] Data, out int EndingIndex, int StartingIndex = 0) { int StartTokenIndex; int EndTokenIndex; IPDFObject ParsedObject = null; string Token = GetTokenString(Data, StartingIndex, out StartTokenIndex, out EndTokenIndex); if (!string.IsNullOrEmpty(Token)) { if ((ParsedObject = PDFDictionary.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFArray.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFString.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFHexString.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFObjectDefinition.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFIndirectObject.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFNumber.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFName.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } if ((ParsedObject = PDFComment.TryParse(Token, Data, StartTokenIndex, out EndingIndex)) != null) { return(ParsedObject); } } // Could not parse next object EndingIndex = StartingIndex; return(null); }
/// <summary> /// Return the offset into the PDF file where an object with the given object number is defined /// </summary> /// <param name="indirectObject">Indirect object reference to the object of interest</param> /// <param name="MatchGeneration">Should the generation number for the object be matched as well? (default: false)</param> /// <returns>Offset into PDF file of object definition, or 0 if object is not found in this cross reference section or represents a deleted object</returns> public int OffsetForObject(PDFIndirectObject indirectObject, bool MatchGeneration = false) { if (this.ContainsObject(indirectObject, MatchGeneration)) { return(ObjectOffsets[indirectObject.ObjectNumber - StartingObject]); } else { // Search subsections for object foreach (PDFCrossReference section in this.Subsections) { if (section.ContainsObject(indirectObject, MatchGeneration)) { return(section.OffsetForObject(indirectObject)); } } return(0); } }
/// <summary> /// Does this cross reference section contain information for the given object? /// </summary> /// <param name="indirectObject">Indirect object reference to the object of interest</param> /// <param name="MatchGeneration">Should the generation number for the object be matched as well? (default: false)</param> /// <returns>TRUE if this cross reference section contains information about the given object, FALSE otherwise</returns> public bool ContainsObject(PDFIndirectObject indirectObject, bool MatchGeneration = false) { return(ContainsObject(indirectObject.ObjectNumber) && (!MatchGeneration || (GenerationForObject(indirectObject.ObjectNumber) == indirectObject.GenerationNumber))); }