示例#1
0
        /// <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));
                }
            }
        }
示例#2
0
        /// <summary>Создаёт новый экземпляр класса <see cref="PdfTextObject"/>.</summary>
        /// <param name="inBytes">Массив байт текстового объекта.</param>
        public PdfTextObject(byte[] inBytes)
        {
            _objectBytes = inBytes;
            var str = PdfFunctions.ConvertByteToString(_objectBytes);

            Parse();
        }
示例#3
0
        /// <summary>Парсит содержимое массива текстового объекта</summary>
        private void Parse()
        {
            int position;
            var font = PdfFunctions.GetTextAttribute(_objectBytes, 0, PdfConsts.PDF_TEXT_FONT, out position);

            if (!String.IsNullOrEmpty(font))
            {
                FillTextParameters(font);
            }
            string text;

            position = 0;
            do
            {
                text = PdfFunctions.GetTextAttribute(_objectBytes, position, PdfConsts.PDF_TEXT_PLAIN, out position);
                if (!String.IsNullOrEmpty(text))
                {
                    AddPlainText(text);
                }
            }while (!String.IsNullOrEmpty(text));
            position = 0;
            do
            {
                text = PdfFunctions.GetTextAttribute(_objectBytes, position, PdfConsts.PDF_TEXT_ASSEMBLY, out position);
                if (!String.IsNullOrEmpty(text))
                {
                    AddAssemblyText(text);
                }
            }while (!String.IsNullOrEmpty(text));
        }
示例#4
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 = "";
            }
        }
示例#5
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);
        }
示例#6
0
        /// <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));
        }
示例#7
0
        /// <summary>Парсит и заполняет список текстовых объектов внутри Pdf объекта</summary>
        private void FillTextData()
        {
            var inBytes  = Compressed ? _uncompressedBytes : _objectBytes;
            var position = 0;

            byte[] data;
            do
            {
                data = Compressed ? PdfFunctions.GetEncodedTextBlock(inBytes, position, out position) : PdfFunctions.GetTextBlock(inBytes, position, out position);
                if (data != null)
                {
                    TextObjects.Add(new PdfTextObject(data));
                }
            }while (data != null);
        }
示例#8
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();
            }
        }
示例#9
0
        private void AddHexaDecimalPlainText(string value)
        {
            var startPos = value.IndexOf("<", StringComparison.Ordinal);

            if (startPos == -1)
            {
                return;
            }
            var endPos   = value.IndexOf(">", StringComparison.Ordinal);
            var res      = endPos == -1 ? value.Substring(startPos) : value.Substring(startPos + 1, endPos - startPos - 1);
            var i        = 0;
            var outValue = "";

            while (i < res.Length)
            {
                var current = res.Substring(i, 2);
                outValue += (char)Int32.Parse(current, System.Globalization.NumberStyles.HexNumber);
                i        += 2;
            }
            outValue = PdfFunctions.AnsiToUnicode(outValue);
        }
示例#10
0
        /// <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);
        }