Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

чтение текстовых данных из двоичных файлов (PDF)


ford ©   (2010-06-03 11:17:00) 

Доброго времени суток!
Люди, подскажите алгоритм чтения объектов из файлов PDF формата. Дело в том что экспериментируя на одном файле я добился нормального чтения, но попробовал другие и встал в ступор.
объекты там бывают двух видов (имеется ввиду содержимое объектов): просто текстовый объект и текстовый объект+двоичные данные потока.
формат записи самого объекта это:
<номер объекта><пробел><номер ревизии><пробел>obj<?>[<<]/<имя праметра><?><данные параметра>...[>>][stream<?><поток><?>endstream]<?>endobj<?>

если читать файл как текстовый то возникает проблемма когда в потоке стоит символ конца строки, да и данные в этом случае не правильные, поэтому я читаю как двоичный файл по байтно до сивола с кодом 13 или 10 и добавляю к строке. Когда встречаю stream то читаю из потока побайтно как строку, пока не встречу там  endstream, тогда взяв разницу позиций начала stream и конца endstream возвращаю указатель в потоке и читаю из него в другой поток двоичные данные.
все бы замечательно но ступор в следующем
там где я отметил формат как <?> в разных файлах находиться разные вещи, а именно это может быть пробел или символ с кодом 13 или два символа с кодами 13 и 10 или символ с кодом 10
а может и ничего не быть :(
т.е. например:
1. 10 0 obj<</Type /Catalog>>endobj
2. 10 0 obj
<</Type /Catalog>>
endobj
3. 10 0 obj<</Type#10/Catalog>>
endobj
4. 10 0 obj#13<</Type /Catalog>>#13stream......#13endstream#13endobj

т.е. полный разброд и шатание, как говориться как бог на душу положит :(
в итоге я не могу нормально прочитать строки и двоичные данные потому что в каждом файле могут быть свои разграничители

подскажите алгоритм как лучше построить чтение такой вот дурацкой информации


c cccc   (2011-05-15 18:33:00) [1]

%PDF-1.5
%вгПУ
1 0 obj
endobj
2 0 obj
endobj
3 0 objstream
H‰мW]ЏЫё\x15}џ_ЎGy\x113в·X\x18і@‘l7н"/сbЃMъа\xFНxє\x19\xF П$Аю‘ю‘ю¶>хЎ—ј¤D‘тШJf‚-Р\x4цH”|I^ћ{О№/ятЋ\x16Ч‡‹?//^.—ў Етк‚V¤bE\x5ясЉjE$+˜Р„Љby{Q\x15ЧрYnмЧз‹І˜-яq1§D\x1B%Љ9ь¤RЕтХ…Ѕац’№7`\x2ж'0ДФ8Ѓ»ўІ¶\x13h& Uv\x2\x17\x4f¶?ю©Щµл‡НОЕЁ
˜‡Jыи\x15.ЎьPъа\x14ѓW„Г?€н—P ыЪўbb[1M+&Їаі®˜Трaр\x11—ѓХqbґя}щaж¦}Ѕј RЫ\(C Їf41EE„6°ю¶№ёІ)¤јЫ\x17ЏцҐ$і?µ‰ілЎv=n‡”№ьЅ]Бо¶Нѕxww{ЫґWM{\x37эv5Хё˜тo\x1F››}У\x16їЬ4Ы¦Э Э}|Ш_\x1F~{h\xF~ќ}\x16адВRЄx)Њ…3мRг\xEСжЗ@.jшШЬH›§a^\x18СрЬ'ЦҐѕH3П$\x4w/аюЊO=†ѓї›(нWiЪ©`tJxж–яЮЖ\x17\x10\x7Fu9\x7ь,вѓ…Пцr\xE\x19Pn\x11—\x7F_юu0cj“НhЯg\x2rгr/ЊПэг(Ј2 LG\x8«qлZБ‡щ{>Ь¶Д№&lЫVWїm»БљФцneП.Щ# Їf“’Кєи\xE\xF—sA ЬЙЌ?ѕnDAВ9\x11\x7Fґ>йЪ$+Ђ
\x1AIЈzDNр€Н№\x6`&
i\x18a*а\x14\x7FA‰_є\x8KЧRИ±Ѕсho2Ю[АЈ°\x7"/\x7б(‘Rеh\x18\xFЧodбFгсЪ4\x1\x12\x7‘\x19бFЋ\x1EВ±ИМGvI_ыДЇ0СЋВьµRш\x1C’>˜\x11r\xEыKСY’d^W\x19u\x1CТ•ЦЭ\x2\x17щ&Ђл\x4 ЏЋ‘
Ћ1Ю‹¬\x3KМ‡•!pб\x1DЯц‰7l”WЋ¤§§•Сcд•\x1C§cЁЁtШrг‹\x8„BnУ°†ЄsП\x10чC!a\[6z\x11ў»\x4ыBйa"
џґт m®TWXЂ\xEЃЃk=v\x1CЋ¶\x13)VjYхL\x6\x5ижю>ГЉ$•4f\x14+л\x14+І2У 2@Љ¤\x1DЧ|\x1DR†%к“d1иШ8$ЛЮ[fЮ¤‰бlвyВg‚O’±qkБRЖ`•9Ч\x1E\xEI74S\x1B


WhiteSpace   (2010-06-06 10:06:00) [2]

Если мне не изменяет логика и аналогия, то <#32>, <#13>, <#10>, <#9> - все эти символы относятся к группе WhiteSpaces, то есть, что-то типа "пустое пространство". Исходя из той логики, следует предположить, что если где-то встречается один или несколько этих символов (возможно, в перемешку), то это значит, что ты встретил просто разделитель, и тебе все эти символы надо просто пропустить, не забывая, впрочем, что этот разделитель, все-же, что-то там разделяет, и, в общем, не зря там стоит.

То есть, в контексте этого, формат принимает следующий вид:
<номер объекта><WhiteSpace><номер ревизии><WhiteSpace>obj<WhiteSpace>[<<]/<имя праметра><WhiteSpace><данные параметра>...[>>][stream<WhiteSpace><поток><WhiteSpace>endstream]<WhiteSpace>end obj<WhiteSpace>

, где <WhiteSpace> - один или несколько символов из множества [ #32, #13, #10, #9].

Я так думаю.


ford   (2010-06-04 11:45:00) [3]

Самое тяжелое это разбираться в чужих исходниках :) да еще и на С
яж не просил исходник, а алгоритм
я вот читаю побайтно до определенного символа но как то это не очень


Омлет   (2010-06-03 20:22:00) [4]

На сорсфорге же есть читалки пдф. Смотри их исходники.


ford   (2010-06-03 12:03:00) [5]

я уже извращаюсь так
Function ReadStreamString(var src:TStream):String;
Var s:String;
   b:Byte;
Begin
src.Read(b,1);
while (b<>13) and (b<>10) and (src.Position<src.Size) do
 Begin
  s:=s+chr(b);
  src.Read(b,1);
 End;
if (b=13)and (src.Position<src.Size) Then
 Begin
  src.Read(b,1);
  BSym:=0;
  if b<>10 Then src.Position:=src.Position-1
  Else BSym:=1;
 End
Else if src.Position=src.Size Then BSym:=0;
result:=s;
End;

где Bsym глобалная для модуля переменная значение котрой я прибавляю для вычисления начала данных потока stream
т.е. типа size:=f.Position-StorePosition-Length('endstream')-BSym


Наверх

Титульная страница Поиск, карта сайта Написать письмо