2
2
Copyright (c) 1993-2008, Cognitive Technologies
5
����������� ��������� ��������������� � ������������� ��� � ���� ��������� ����,
6
��� � � �������� �����, � ����������� ��� ���, ��� ���������� ��������� �������:
8
* ��� ��������� ��������������� ��������� ���� ������ ���������� ���������
9
���� ����������� �� ��������� �����, ���� ������ ������� � �����������
11
* ��� ��������� ��������������� ��������� ���� � ������������ �/��� �
12
������ ����������, ������������ ��� ���������������, ������ �����������
13
��������� ���� ���������� �� ��������� �����, ���� ������ ������� �
14
����������� ����� �� ��������.
15
* �� �������� Cognitive Technologies, �� ����� �� ����������� �� �����
16
���� ������������ � �������� �������� ��������� �/��� �����������
17
���������, ���������� �� ���� ��, ��� ���������������� �����������
20
��� ��������� ������������� ����������� ��������� ���� �/��� ������� ������ "���
21
��� ����" ��� ������-���� ���� ��������, ���������� ���� ��� ���������������,
22
������� �������� ������������ �������� � ����������� ��� ���������� ����, �� ��
23
������������� ���. �� �������� ��������� ���� � �� ���� ������ ����, �������
24
����� �������� �/��� �������� �������������� ���������, �� � ���� ������ ��
25
��Ѩ� ���������������, ������� ����� �����, ���������, ����������� ���
26
������������� ������, ��������� � �������������� ��� ���������� ����������
27
������������� ������������� ��������� (������� ������ ������, ��� ������,
28
������� ���������, ��� ������ �/��� ������ �������, ���������� ��-�� ��������
29
������� ��� �/��� ������ ��������� �������� ��������� � ������� �����������,
30
�� �� ������������� ����� ��������), �� �� ������������� ���, ���� ���� �����
31
�������� ��� ������ ���� ���� �������� � ����������� ����� ������� � ������.
5
Разрешается повторное распространение и использование как в виде исходного кода,
6
так и в двоичной форме, с изменениями или без, при соблюдении следующих условий:
8
* При повторном распространении исходного кода должны оставаться указанное
9
выше уведомление об авторском праве, этот список условий и последующий
11
* При повторном распространении двоичного кода в документации и/или в
12
других материалах, поставляемых при распространении, должны сохраняться
13
указанная выше информация об авторском праве, этот список условий и
14
последующий отказ от гарантий.
15
* Ни название Cognitive Technologies, ни имена ее сотрудников не могут
16
быть использованы в качестве средства поддержки и/или продвижения
17
продуктов, основанных на этом ПО, без предварительного письменного
20
ЭТА ПРОГРАММА ПРЕДОСТАВЛЕНА ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИМИ ЛИЦАМИ "КАК
21
ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ,
22
ВКЛЮЧАЯ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ, НО НЕ
23
ОГРАНИЧИВАЯСЬ ИМИ. НИ ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ И НИ ОДНО ДРУГОЕ ЛИЦО, КОТОРОЕ
24
МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, НИ В КОЕМ СЛУЧАЕ НЕ
25
НЕСЁТ ОТВЕТСТВЕННОСТИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ ИЛИ
26
ПОСЛЕДОВАВШИЕ УБЫТКИ, СВЯЗАННЫЕ С ИСПОЛЬЗОВАНИЕМ ИЛИ ПОНЕСЕННЫЕ ВСЛЕДСТВИЕ
27
НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ ПОТЕРИ ДАННЫХ, ИЛИ ДАННЫЕ,
28
СТАВШИЕ НЕГОДНЫМИ, ИЛИ УБЫТКИ И/ИЛИ ПОТЕРИ ДОХОДОВ, ПОНЕСЕННЫЕ ИЗ-ЗА ДЕЙСТВИЙ
29
ТРЕТЬИХ ЛИЦ И/ИЛИ ОТКАЗА ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С ДРУГИМИ ПРОГРАММАМИ,
30
НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМИ СЛУЧАЯМИ), НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ДАЖЕ ЕСЛИ ТАКОЙ
31
ВЛАДЕЛЕЦ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ И ПОТЕРЬ.
33
33
Redistribution and use in source and binary forms, with or without modification,
34
34
are permitted provided that the following conditions are met:
86
86
typedef struct hSUB_ALLOC
88
char **Ptr;//[NumPtr][SizePtr[i]]������ ���������� (���������.�����.������-��)
89
int NumPtr,CurrPtr;//����� ����������, ������ �����. ��������
90
long *SizePtr,Size;//[NumPtr]������ ���� ��������� � ����� ����� ������-��
91
long CurrPos; //������� � �����.��������
88
char **Ptr;//[NumPtr][SizePtr[i]]Массив указателей (сегментир.адрес.простр-во)
89
int NumPtr,CurrPtr;//Число указателей, индекс текущ. сегмента
90
long *SizePtr,Size;//[NumPtr]Массив длин сегментов и общей длины простр-ва
91
long CurrPos; //позиция в текущ.сегменте
95
95
#define SIZE_SEGL 65500L
97
//������� ��������� ���������� � ��������� ������
98
//---�������� �����(=> � ������) �� ����� �����
97
//Задание априорной информации о структуре таблиц
98
//---Иерархия линий(=> и бланка) по типам линий
99
99
typedef struct hHIER_LINE
101
int NumLev; //����� V- ��� H-�������
102
BYTE *TypeLine;//[NumLev] ���� ����� �� V- ��� H-�������
101
int NumLev; //Число V- или H-уровней
102
uchar *TypeLine;//[NumLev] Типы линий на V- или H-уровнях
105
//---�������� �����/�������� ������� (�����������, ��������� ��������
106
//�������� ��������. ����/����� �������)
105
//---Иерархия шапки/боковика таблицы (фиксирована, полностью задается
106
//номерами терминал. граф/строк таблицы)
107
107
typedef struct hKNOT_TABL
109
int beg,end;//������. ������ ��������. ���� ����
110
char *Name; //��� ���� | NULL | "NO_OCR" => ����� ����� ���� �� ���� OCR-��
109
int beg,end;//Гранич. номера терминал. граф узла
110
char *Name; //Имя узла | NULL | "NO_OCR" => нутро этого узла не надо OCR-ть
112
112
typedef struct hCAPTION_TABLE
114
int NumLev; //����� ������� �����/��������
115
int *NumCol; //[NumLev] ����� ���� �������
116
KNOT_TABL **TreeCapt; //[NumLev][NumCol[NumLev]] ���� ������ �� �������
114
int NumLev; //Число уровней шапки/боковика
115
int *NumCol; //[NumLev] Числа граф уровней
116
KNOT_TABL **TreeCapt; //[NumLev][NumCol[NumLev]] Узлы дерева по уровням
118
//--- V- ��� H-��������, ������������ �� ��������� ������ � �������
118
//--- V- или H-иерархия, определяемая по геометрии текста в ячейках
119
119
typedef struct hHIER_CELL_TXT
121
int NumCol; //����� ����(H|V), ������ ������� ������ ���������. ��������
122
int *IndCol;//[NumCol] ������� ���������������� ����
121
int NumCol; //Число граф(H|V), ячейки которых задают ортогонал. иерархию
122
int *IndCol;//[NumCol] индексы классообразующих граф
124
//---������.���-��� � ������������ �����
124
//---Априор.инф-ция о расположении линий
125
125
typedef struct hLINE_INTRVL
127
int Interval,sko;//�������� �� ����.������-����� � ��� �.�.�
127
int Interval,sko;//интервал до след.соседа-линии и его с.к.о
131
131
typedef struct hLINE_APRIOR
133
int Num; //����� V- ��� H-�����
134
LINE_INTRVL *Line;//[Num] - ������� ���������� V- ��� H-�����
133
int Num; //Числа V- или H-линий
134
LINE_INTRVL *Line;//[Num] - массивы интервалов V- или H-линий
136
//---����� �������� �����!!!ADD XOR � �.�.!!!
136
//---Набор символов графы!!!ADD XOR и т.п.!!!
138
138
typedef struct hCONTENT
140
uint Digit:1, //�����
142
LowerCase:1, //��������� �� ����� �����
143
UpperCase:1, //--//-- �������
144
PunctuationMarks:1,//����� ����������
145
MultiPoints:1, //����������
148
ProperName:1, //������ ����� ������ - ��� �����������
149
All:1, //����� ������
151
BYTE *SpecSymb; //����� ����������� � ����� �-������ ��������� ���������
140
uint Digit:1, //цифра
142
LowerCase:1, //допустимы ли малые буквы
143
UpperCase:1, //--//-- большие
144
PunctuationMarks:1,//знаки препинания
145
MultiPoints:1, //многоточие
148
ProperName:1, //первое слово ячейки - имя собственное
149
All:1, //любой символ
151
uchar *SpecSymb; //здесь перечислены в форме С-строки возможные отдельные
155
155
#define IN_NO -30000
157
157
#define ALG_BEG 0
158
158
#define ALG_END 1
159
159
#define ALG_CENTER 2
160
160
#define TRUEinBLOCK 2
172
172
typedef struct hINF_CELL
175
uint JustH:2, //�����.������������(LEFT/RIGHT/CENTER)
176
JustV:2, //����. ������������(TOP/BOTTOM/CENTER)
177
FontSizeConst:1,//���������� ������ ������ � �������
178
FontStyle:3, //���������� ���.������ Normal|Bold|Italic
179
MultiStr:1, //������������� ������
180
MultiWord:1, //������������ ������
181
TreeCell:1, //�������� �� ����������� ��������� ������
182
SortedNumber:2, //���� �� ������� �� ������� ���� �����(TRUE),
183
//���� � �������� ��������� �����(TRUEinBLOCK)
184
//���� ��� ������� (FALSE) (����� ����� ������ ���
185
//����, CONTENT �������=DIGIT
175
uint JustH:2, //гориз.выравнивание(LEFT/RIGHT/CENTER)
176
JustV:2, //верт. выравнивание(TOP/BOTTOM/CENTER)
177
FontSizeConst:1,//постоянный размер шрифта в колонке
178
FontStyle:3, //комбинация бит.флагов Normal|Bold|Italic
179
MultiStr:1, //многострочная ячейка
180
MultiWord:1, //многословная ячейка
181
TreeCell:1, //возможна ли древовидная структура ячейки
182
SortedNumber:2, //есть ли порядок на ячейках всей графы(TRUE),
183
//либо в пределах строчного блока(TRUEinBLOCK)
184
//либо нет порядка (FALSE) (имеет смысл только для
185
//граф, CONTENT которых=DIGIT
200
200
typedef struct hSMP_LINE
202
int Coor,Interval,sko;//����-�� ��� �����,�������� �� ������ ,�.�.�. ���������
203
BYTE TypeLine; //��� �����
205
int Num; //����� ���������, ������������ � ���� ��������
206
int LenShad; //����� �����.���������
207
int Ave; //����������� ����-�� ���������
208
int AveThick; //����������� ������� �����
202
int Coor,Interval,sko;//Коор-та оси линии,интервал до соседа ,с.к.о. интервала
203
uchar TypeLine; //Тип линии
205
int Num; //Число измерений, соотнесенных с этим эталоном
206
int LenShad; //Длина взаим.затенения
207
int Ave; //Усредненная коор-та измерений
208
int AveThick; //Усредненная толщина линии
210
210
typedef struct hCOOR_IDENT
212
212
short Coor,Thick;
213
BYTE Id; //TRUE ��� FALSE, ���� ����� �� ������������� �������� �����,
213
uchar Id; //TRUE или FALSE, если линия не соответствует реальной линии,
216
216
typedef struct hKNOTT
218
218
struct hKNOTT *next,*back,*up,*down;
219
RECT Rect;//������./�����. ����� ���� ���� ������� ������.�����
220
int InBegFrm,NumFrm;//������ �����.����� � ����� ����� ����
221
int InColA; //������ ������.�����(ParTabl.InfCell[InColA])
222
//int InTerm; //������ ��������.������(sym[InTerm][nstr][ncomp])
223
//���� InTerm �.�. ��������� � ����� InBegFrm
219
RECT Rect;//Пиксел./текст. рамка узла либо индексы гранич.линий
220
int InBegFrm,NumFrm;//Индекс начал.рамки и число рамок узла
221
int InColA; //Индекс априор.графы(ParTabl.InfCell[InColA])
222
//int InTerm; //Индекс терминал.ячейки(sym[InTerm][nstr][ncomp])
223
//поле InTerm м.б. совмещено с полем InBegFrm
224
224
uint OrderChild:4, //UNSORT,VER,HOR,MATR,TABL,FORMUL,TERM
225
225
Type:4, //TXT,TITLE,CELL,CELL_TITLE,CELL_CAPT,HIER_V,HIER_H
226
AllowOCR:1, //TRUE/FALSE - ������ �� ���� ���� �� ������-��� ��������
227
JustH:2, //�����.������������: ALG_BEG/ALG_END/ALG_CENTER
228
JustV:2, //����. ������������: --/--
226
AllowOCR:1, //TRUE/FALSE - должен ли узел идти на распоз-ние символов
227
JustH:2, //Гориз.выравнивание: ALG_BEG/ALG_END/ALG_CENTER
228
JustV:2, //Верт. выравнивание: --/--
230
//� ������ AllowOCR=FALSE �.�. ������ �� ������ ������ ������� ����
231
//��� ������ �.�. ������ ����. �������:
233
//1. InBegFrm - ������ ������ � �������. ������� �����
230
//В случае AllowOCR=FALSE м.б. ссылка на строку текста данного узла
231
//Эта ссылка м.б. задана след. образом:
233
//1. InBegFrm - индекс строки в одномер. массиве строк
234
234
//2. union {int InBegFrm,NumFrm; char *str;}
235
235
//3. InBegFrm,NumFrm - ParTabl.CaptionV.TreeCapt[InBegFrm][NumFrm]
236
//4. ������ ����� ���� char *str;
237
//������ 3 ������������ ����, ���. �� ���� OCR-��, ���� ����. ������ => �� ���
238
//������ 1 ��������, ���� �������� ����. �������. ������ ��� ����� => �� ���
239
//����� �/��������� 2 � 4:
240
//(2) �� ������ ���, ��� �����. ��������. ������� � ����� ���-���� ���� �����
241
//����� ������ � ����������� ����, ���. �� ���� ��������
236
//4. Просто новое поле char *str;
237
//Способ 3 ограничивает поля, кот. не надо OCR-ть, лишь верт. шапкой => не ага
238
//Способ 1 пригоден, если заводить спец. одномер. массив для строк => не ага
239
//Выбор м/способами 2 и 4:
240
//(2) не удобно тем, что появл. дополнит. уровень и вдруг все-таки надо будет
241
//иметь доступ к компонентам узла, кот. не надо узнавать
243
struct hKNOTT *RefOrt; //������ �� ���� ����� ���������. ��������
244
struct hKNOTT *RefH; //������������.������ �� V-�����
245
//�������: ���� ���� ��� ��������.�����, �� �� ����� ���������� � down,
246
//����� �����. ������ (? � ������ �� ���������� ���� str � ReferOrt?)
247
//??� ����� �� ������ ������ �/���������.����������, �.�. InTerm - ���
248
//������ ������������� ����.������ � ������ �.�. �� �����������
249
//��� ���������� ������ � �������������� �� ���� ������������� �� �����.TREE
243
struct hKNOTT *RefOrt; //Ссылка на узел куста ортогонал. иерархии
244
struct hKNOTT *RefH; //Эквигоризонт.ссылка на V-узлах
245
//Способы: если лишь для терминал.узлов, то ее можно совместить с down,
246
//иначе отдел. ссылка (? а нельзя ли совместить поля str и ReferOrt?)
247
//??А нужны ли вообще ссылки м/ортогонал.иерархиями, т.к. InTerm - уже
248
//задает идентификатор терм.ячейки и вообще м.б. не понадобится
249
//при построении дерева и форматировании по нему перескакивать на ортог.TREE
251
251
typedef struct hTREE2
253
KNOTT *Root,*free; //������ � ������ ������ ������. ��������� ������
254
int NumKnot; //����� ����� ����� � �����. ������������
255
int NumSeg;KNOT **ArrSeg; //���������. ������
253
KNOTT *Root,*free; //Корень и голова списка свобод. элементов дерева
254
int NumKnot; //Общее число узлов в списк. пространстве
255
int NumSeg;KNOT **ArrSeg; //Сегментир. массив
257
257
typedef struct hSEG_ARR
259
KNOT3 *free; //������ ������ ������. ��������� ������
260
int NumKnot;//����� ����� ����� � �����. ������������
261
int NumSeg;KNOT **ArrSeg; //���������. ������
259
KNOT3 *free; //голова списка свобод. элементов дерева
260
int NumKnot;//Общее число узлов в списк. пространстве
261
int NumSeg;KNOT **ArrSeg; //Сегментир. массив
263
typedef struct hLINE_KNOT //�������� ����� ��� ����� ������
263
typedef struct hLINE_KNOT //Описание линии для узлов дерева
265
int beg; //��� V-Line ��� ����� ������� ������� �����
266
int BegTxt; //��������� ����-��
267
BYTE Thick; //�������
265
int beg; //Для V-Line это левая граница толстой линии
266
int BegTxt; //Текстовая коор-та
267
uchar Thick; //Толщина
268
uchar TypeLine; //Тип
270
270
typedef struct hKNOT_TMP {KNOTT *Knot; int in;} KNOT_TMP;
272
typedef struct hSTAT_CELL //���������� �� ������
272
typedef struct hSTAT_CELL //Статистика по ячейке
274
int dx, //��������.������
275
dyLow,//-/- ������ �����.
276
dyUpp,//-/- ������ ������.
277
dsym, //-/- ���������.��������
278
dstr, //-/- ��������. ��������
279
HeiStr;//������ ������ � ��������.����������
274
int dx, //стандарт.ширина
275
dyLow,//-/- высота строч.
276
dyUpp,//-/- высота пропис.
277
dsym, //-/- межсимвол.интервал
278
dstr, //-/- межстроч. интервал
279
HeiStr;//высота строки с межстроч.интервалом
281
281
typedef struct hINDEX_SORT {int ind,value;} INDEX_SORT;
283
283
typedef struct hINF_TREE
285
int TypeDoc; //�������: PLAIN - PlainText, ...
287
KNOTT *Table,*HierV,*HierH;//��������� ���� ������
288
KNOTT **TermV;//[NumTV] - ��������. V-�����
285
int TypeDoc; //Признак: PLAIN - PlainText, ...
287
KNOTT *Table,*HierV,*HierH;//Некоторые узлы дерева
288
KNOTT **TermV;//[NumTV] - терминал. V-графы
290
STAT_CELL *StatCell;////[NumTV] - ����-�� �� ����. V-������
290
STAT_CELL *StatCell;////[NumTV] - Стат-ка по терм. V-графам
291
291
PAR_TABL ParTabl;
293
LINE_KNOT *LineVK,*LineHK;//[nH],[nV]-��������� ������ ������������� � ���-��
293
LINE_KNOT *LineVK,*LineHK;//[nH],[nV]-разграфка дерева горизонталями и вер-ми
295
//++������� �������� �����
295
//++Индексы ключевых линий
296
296
int InLineBotTabl;
297
//++���-�� ����. �����
298
KNOTT **ColT;//[NumT] - ��������. ������
297
//++Стр-ра терм. ячеек
298
KNOTT **ColT;//[NumT] - терминал. ячейки
302
int DislocationX,DislocationY;//��������� ������
303
int MonoSpace,MonoSpaceTrue; //������� ������ � �����.���������
302
int DislocationX,DislocationY;//параметры сдвига
303
int MonoSpace,MonoSpaceTrue; //толщина штриха и истин.моноспейс
304
304
int SizeXGlob,SizeYGlob;
306
//++�������� ��������.�����
306
//++Описания терминал.ячеек
307
307
BOUND bnd_page,*bnd_col,**bnd_str;
309
309
int k_colt,**k_sym;
311
311
STAT_COL *StatCol;
312
312
POS_STR **PosStr;
313
char FilePrc[255];//��� ����� ��������.���������
313
char FilePrc[255];//имя файла извлечен.компонент
314
314
SUB_ALLOC SubTree;
316
316
FUN_MESS FunMessage;