/// <summary>Заполняет список объектов документа</summary>
        private static void FillObjects()
        {
            var position = PdfFunctions.GetPosition(_documentBytes, 0, PdfConsts.PDF_TRAILER);

            position = PdfFunctions.GetPosition(_documentBytes, position, PdfConsts.PDF_SIZE) + 1;
            var value    = PdfFunctions.GetValue(_documentBytes, position, PdfConsts.PDF_BACKSLASH);
            var objCount = Convert.ToInt32(value);

            for (var i = 1; i < objCount; i++)
            {
                var name = i.ToString(CultureInfo.InvariantCulture) + " 0 " + PdfConsts.PDF_OBJECT;
                var data = PdfFunctions.GetObjectData(_documentBytes, 0, name);
                if (data == null)
                {
                    continue;
                }

                var type = GetObjectType(data);
                if (type == PdfObjectType.Page)
                {
                    Pages.Add(new PdfPage(name, data));
                }
                else
                {
                    Objects.Add(new PdfObject(name, data, type));
                }
            }
        }
Exemple #2
0
        /// <summary>Заполняет координатами переданный блок</summary>
        /// <param name="box">Массив координат.</param>
        /// <param name="boxName">Имя блока в PDF.</param>
        private static void FillBox(decimal[] box, string boxName)
        {
            var pos = PdfFunctions.GetPosition(_objectBytes, 0, boxName);

            if (pos == -1)
            {
                return;
            }

            pos += 2;
            var res      = (char)_objectBytes[pos];
            var value    = "";
            var position = 0;

            while (res != PdfConsts.PDF_CLOSE_QUAD_BRACKET)
            {
                value += res;
                pos++;
                res = (char)_objectBytes[pos];
                if (res != PdfConsts.PDF_SPACE && res != PdfConsts.PDF_CLOSE_QUAD_BRACKET)
                {
                    continue;
                }

                box[position] = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
                position++;
                value = "";
            }
        }
Exemple #3
0
        /// <summary>Распаковывает запакованные данные</summary>
        /// <returns>true если массив распакован, иначе false</returns>
        private static bool DecompressData()
        {
            var length     = Convert.ToInt32(PdfFunctions.GetAttribute(_objectBytes, 0, PdfConsts.PDF_STREAM_LENGTH));
            var startIndex = PdfFunctions.GetPosition(_objectBytes, 0, PdfConsts.PDF_START_STREAM) + 1;

            if (startIndex == -1)
            {
                return(false);
            }
            var endIndex = startIndex + length + 1;

            //Убираем #10#13 в начале и конце
            if (_objectBytes[startIndex] == 0x0d && _objectBytes[startIndex + 1] == 0x0a)
            {
                startIndex += 2;
            }
            else if (_objectBytes[startIndex] == 0x0a || _objectBytes[startIndex] == 0x0d)
            {
                startIndex++;
            }

            if (_objectBytes[endIndex - 1] == 0x0d && _objectBytes[endIndex] == 0x0a)
            {
                endIndex -= 2;
            }
            else if (_objectBytes[endIndex - 1] == 0x0a)
            {
                endIndex--;
            }
            else if (_objectBytes[endIndex] == 0x0d || _objectBytes[endIndex] == 0x0a)
            {
                endIndex--;
            }

            var streamBytes = new byte[length];
            var counter     = 0;

            for (int i = startIndex; i <= endIndex; i++)
            {
                streamBytes[counter] = _objectBytes[i];
                counter++;
            }
            if (streamBytes[0] == 72)
            {
                _uncompressedBytes = PdfFunctions.Decompress(streamBytes);
            }
            else
            {
                return(false);
            }
            return(true);
        }
        /// <summary>Возвращает версию Pdf-документа</summary>
        /// <returns>Версия pdf-документа</returns>
        private static decimal GetVersion()
        {
            var pos = PdfFunctions.GetPosition(_documentBytes, 0, PdfConsts.PDF_VERSION) + 1;

            if (pos == -1)
            {
                return(0);
            }

            var value = PdfFunctions.GetValue(_documentBytes, pos, PdfConsts.PDF_RETURN);

            return(Convert.ToDecimal(value, CultureInfo.InvariantCulture));
        }
Exemple #5
0
        /// <summary>Разбирает данные входного массива</summary>
        private void ParseData()
        {
            //Получаем сжатие, если его нет, то и смысла дальше парсить нет
            var position  = PdfFunctions.GetPosition(_objectBytes, 0, PdfConsts.PDF_FLATE_DECODE);
            var parseText = true;

            if (position != -1)
            {
                //объект сжат в поток, разожмем
                Compressed = true;
                parseText  = DecompressData();
            }
            if (parseText)
            {
                FillTextData();
            }
        }
        /// <summary>Возвращает тип объекта</summary>
        /// <param name="inBytes">Входной поток объекта между [1 0 obj] и [endobj].</param>
        /// <returns>Тип объекта, если он есть в перечислении PdfObjectType и Undefine если нет</returns>
        private static PdfObjectType GetObjectType(byte[] inBytes)
        {
            var position = PdfFunctions.GetPosition(inBytes, 0, PdfConsts.PDF_TYPE);

            if (position == -1)
            {
                return(PdfObjectType.Undefine);
            }

            position += 2;
            var current = (char)inBytes[position];
            var value   = "";

            while (current != PdfConsts.PDF_CLOSE_TRIANGLE_BRACKET && current != PdfConsts.PDF_BACKSLASH)
            {
                value += current;
                position++;
                current = (char)inBytes[position];
            }
            PdfObjectType result;

            return(Enum.TryParse(value, false, out result) ? result : PdfObjectType.Undefine);
        }