示例#1
0
        public static PDFFileIndirectObject Parse(PDFTextSearcher searcher, int number, int gen)
        {
            string start = number.ToString() + " " + gen.ToString() + " obj";

            string end       = "endobj";
            string endstream = "endstream";
            string stream    = "stream";

            string matchstart = searcher.GetInnerText(start.Length);

            if (matchstart != start)
            {
                throw new PDFNativeParserException(string.Format(CommonErrors.IndirectObjectCannotBeParsed, start));
            }
            long startPos = searcher.Position;

            PDFFileRange endobjPos = searcher.MatchForwardString(end);

            if (endobjPos.Found == false)
            {
                throw new PDFNativeParserException(string.Format(CommonErrors.IndirectObjectCannotBeParsed, start));
            }

            PDFFileRange endstreamPos = searcher.MatchBackwardString(endstream, startPos);

            PDFFileRange startstreamPos;

            if (endstreamPos.Found)
            {
                startstreamPos = searcher.MatchBackwardString(stream, startPos);
                if (startstreamPos.Found == false)
                {
                    throw new PDFNativeParserException(string.Format(CommonErrors.IndirectObjectCannotBeParsed, start));
                }

                endobjPos = startstreamPos;
            }
            else
            {
                startstreamPos = PDFFileRange.NotFound;
            }
            int length = (int)(endobjPos.StartOffset - startPos);

            string data = searcher.GetInnerText(startPos, length);

            PDFFileIndirectObject parsed = new PDFFileIndirectObject(number, gen, data);

            parsed._offset = startPos;

            if (startstreamPos.Found)
            {
                parsed.SetStreamData(searcher.GetInnerBytes(startstreamPos, endstreamPos));
            }
            parsed.EnsureDataParsed();

            return(parsed);
        }