/// <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)); } } }
/// <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 = ""; } }
/// <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)); }
/// <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); }