示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
            }
        }
示例#3
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)));
 }