Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
ford ©   (2010-06-03 11:17) [0]

Доброго времени суток!
Люди, подскажите алгоритм чтения объектов из файлов 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

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

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


 
ford ©   (2010-06-03 12:03) [1]

я уже извращаюсь так
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


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

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


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

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


 
WhiteSpace   (2010-06-06 10:06) [4]

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

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

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

Я так думаю.


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

%PDF-1.5
%вгПУ
1 0 obj<</contents>>
endobj
2 0 obj<</font<</tt1>>/ProcSet[/PDF/Text]/ExtGState<</gs1>>>>
endobj
3 0 obj<</length>>stream
H‰мW]ЏЫё}џ_ЎGy3в·Xі@‘l7н"/сbЃMъаНxє П$Аю‘ю‘ю¶>хЎ—ј¤D‘тШJf‚-РцH”|I^ћ{О№/ятЋЧ‡‹?//^.—ў Етк‚V¤bEясЉjE$+&#732;Р„Љby{QЧрYnмЧз‹І&#732;-яq1§D%Љ9ь¤RЕтХ…Ѕац’№7`ж"0ДФ8Ѓ»ўІ¶h& Uvf¶?ю©Щµл‡НОЕЁ
&#732;‡Jыи.ЎьPъаѓW„Г?€н—P ыЪўbb[1M+&Їаі®&#732;Трaр—ѓХqbґя}щaж¦}Ѕј RЫ\(C Їf41EE„6°ю¶№ёІ)¤јЫЏцҐ$і?µ‰ілЎv=n‡”№ьЅ]Бо¶Нѕxww{ЫґWM{7эv5Хё&#732;тo››}УїЬ4Ы¦Э Э}|Ш_~{h~ќ}адВRЄx)Њ…3мRгСжЗ@.jшШЬH›§a^СрЬ"ЦҐѕH3П$w/аюЊO=†ѓї›(нWiЪ©`tJxж–яЮЖu9ь,вѓ…ПцrPn—_юu0cj“НhЯgrгr/ЊПэг(Ј2 LG«qлZБ‡щ{>Ь¶Д№&lЫVWїm»БљФцneП.Щ# Їf“’Кєи—sA ЬЙЌ?ѕnDAВ9ґ>йЪ$+Ђ
IЈzDNр€Н№`&
ia*аA‰_єKЧRИ±Ѕсho2Ю[АЈ°"/б(‘RеhЧodбFгсЪ4‘бFЋВ±ИМGvI_ыДЇ0СЋВьµRш’>&#732;rыKСY’d^WuТ•ЦЭщ&Ђл ЏЋ‘
Ћ1Ю‹¬KМ‡•!pбЯц‰7l”WЋ¤§§•Сc䕧cЁЁtШrг‹„BnУ°†ЄsПчC!a\[6zў»ыBйa"
џґт m®TWXЂЃЃk=vЋ¶3)VjYхLижю>ГЉ$•4f+л+І2У 2@Љ¤Ч|R†%к“d1иШ8$ЛЮ[fЮ¤‰бlвy<9’^ІB4ЪЫ“? iDU^j^И®Ћќ„џE =ЃС›’Щ0Ќ“УЪ<Лj-N#™U¤®j#щ&#732;
CТ.=2§VJjГШЙuѓЮQ¦ћЌYїjѓ
ҐЦ/OEЦжО*ќb”ЅТ•~‰Т=}>qЖqУYр cґe;Џiэ©а94Uр”ОР®їо*Лчџ/Ю—ЇVыЯљЕхГэ V
ѕЗ4‡вєЩ…БџчЫвНnЯмїџYu°П†~Лпb$v}’ЧD№ПУ:?nNм&3a/rEтЫ{TuеП}…±ЃH§дл&#732;П‹¦VЦуnҐ’]+Ў/
OШђт“ъо(z!Q$AT%І*{l‹Ў®yж`5яУtц-‰p„±XЇRLHiСќ…шHFмЏЦ…Ћ%,EСaф=QвP»f8і"ФиiДт,¦лMшjЧ#*A;ЏН‰™M¦C{уХл ‚ef%ЕЋЪфb‹•‰гєтг<uЙftt5њЎ»з›ѓckw,ЌЗ©dО4&y¬УЙ8eєwxвтГ"p!МyheЁіuЬвЅ6y"h…€йъЛтo (ї5q’йl}‘дЛ_fsetyrjdy|^µ‡ы$ј,¶ЕЌ»ЪыgЫf_ьРґ8Фw—Е?sэҐЊ(.t‡vѕ>шR·ч+и·IНџ ж&#732;зћ3З3—†uWM FU КЖвЕєін]{oс аAЋ‡љpAy¶…О&#732;=YЫ†*лЎаBЄ,$ќ$·”ghИm#Tu,±T
АН
ђw‰e&#732;ШW®фґ+ЅO7оІщ€#п6»п!СM‹НЊ•k|лРЊЧ!4Y,sу]вG†›LJ‘ймў дe…Т,\ЕГ¶ЩВw"МUS*ќЂЫIеФ|Р№єид\d]MРY|ьИ”2N_^cЉ&#732;BЃvPQЌQ[c@јM±CdH‡Њmэµ Б+яиSУ®ЫХf‡·XЌt ЂGjкз-З§%ж^ўf—‚ИEЯb9cz•аЉpбфМ 9НOиz’ШDHQ№R3я."`fёИАБTЄеjЦё<Ч
©@•яљЃNВ0<„“?Ьн8^јmљx;UѕЩгPгґНб°
#‡™Тѕ•ѓFGT’cFR<еґОАЊ°;Њ*P„\†jіаЙh\лъq’кГнкўj>fE”¬gЎdЎTtxФЎ7эrD
Н(—§&sd”BічMйOзМ°¶ЋщФЖ 4»№{РіХіIл7бОo‚«|wУ7·3Р+Ђн»;еяX¤ЉІEB“г2"Uз#3l~±ыМшМDe>Вg‚O’±qkБRЖ`•9ЧI74S<ТФ
=ОEСґVя7ѓЯА ЪР±[ЂWkW^м?щ‹Џ(цC?(]‘Ф(AыЩX©рИ№‰ФК(ІЃNN8Bnў<q>С:Ш)RђJџІГIЩWИNш‚$тЧ3" нј„=bЙµ¦Ўс2uъІЂ¶—ыZsX0е~[Мж*Ь5…ЈISвнЅы.¶ ќљЦїІйюЋїиG‹џ’ 8ањтa]ьюp@8м2ф¦ј/х Я=SРl>~ZЉN-§зИLZSЂYOc‹€‰ПVGtYцЊяhЮpЇ¶ћNW],=ЯЄж°ѕ<ѕ›ћH\ЃФћЎН%GO»sЛTўго¬< 3ЗHјљОё›:)ћЗ
"ђ·UФ›™°2]ЖЅ»*ЮмцЂџmУ:PШ!
aAqЭ\pїчАЈcTњ%Quѕa·!ЏУЅ¬ОХыФв™ШФ9l¬:‹·тё \¶vЖ?=°“–/ЩЋЃ#
!Вq"™№¬MНЋ@#®
&Ж0йд-у›UdЇ°јЛіlІVu„rв}ywђ$Ґ«Rџй™XSWщ№ѓ3…·"МBM¤$#МUI1ЎЦ;\кЈY@IЏ¬ЏZЂзUЃWА|D°‚sC8 HУ-Љ x‘ЫK‰TЂЬUG›+G^‚hg‹дpФЎ)Т)гЦпЏEкqґЧv‘«”9И”/rdUЛИOО›bЂ«Nor·ЛAт№М“wћМж›НО™\мUtЧ«иТя:,Ыbхp„ЮщiµЯ6yqщ]Ъ ј/_у:9Htлњ4>84»Ц“ЇЅЗпЖIх>‰]ч<Пq†W–б0ь[Зр о3лБ`|p уЁK|„sє«П°рц`ќf2…иCыДмА°[»ф¦ъµБ«{чЌлwЎЉOM»nW›>!3X*hО ~.UсЁVОЮёЛ}±я*Чп(J8ѕqТґ+`Е‡цыOw±zEk±·dVЩ}"
f+–4);*%ЋшЌј)й8±k!R6PZ={Гw*°гЊt›Bљ:_‹›ЎSvD¤]ђЦ"DПxЂњаЃО™5љ"Е&QЪ“vЌ№ђ;ЎІ С^Мujн ґ\џиOЖXxhSФА¦Ё1›Тї·¶:aЖьLMОПx.Ї—я sвке

endstream
endobj
4 0 obj<</contents>>
endobj
5 0 obj<</font<</tt2>>/ProcSet[/PDF/Text]/ExtGState<</gs1>>>>
endobj
6 0 obj<</length>>stream
H‰мWНЋЫИѕПSфЮЁ…EіяI`0@Ї7цЖИБr&#732;НЃ’Ё‘’±&ђf<Ајм^т {К!UХMІЩ-QRЦv‚ hИ&Щх__}эъЗЏњЭнЇ~?»z=›)ЖЩluЕ‹ј¬Ђ?wЗ­Йµ`BЩњ+6ыtU°;шНшпщ*c“Щ_Їј”ЬІ)l) ›Ѕ№В‰_e’ѕ Т)&#732;ВЗєЁ&#732;*sЈЊm?фхнu!TUSГOЬЁ\_ыEYЭАЇѕщЛм}`ЇМ-/
&#732;‹rHa¤ЇИ…жЪ}@ц9»PоеБХЬёmтnГ™E+С›®WpUю5МбgЙъЃ&•KQIЇ
ЃTФ—З!ГT]±)П№Ц¶і Tкj(ІИЌQЦ‰3њмVmМ1ј–{ГнЌИ
<ґ&ЉµИ•ґьМИPR«60+§ЈMҐxZ.sQZuЃtО;у«™Л°TЮќёPiq‰јЩеЦЂQаE>Ьw,•"/
ыL%ъ=Џ·*%щйTѕ\фq¤ґLU.pҐ±аКOeТЃЉWвМђ^S_G¶jи‚3m-l[Qуґ‚ЉјRж’д<”†IХю^ыz5qЌ–Ђя¦uмўў<аXЊіЎҐOҐЋБ‡C;ЇXСV, u [YЊ&#732;WZ•Яг/



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.146 c
2-1332009127
pooh001
2012-03-17 22:32
2013.03.22
регистронезависимый запрос SQL (Absolute DB или Accuracer)


4-1259356501
istok20
2009-11-28 00:15
2013.03.22
OpenProcess и 64bit applications...


15-1352200214
Стратокастер
2012-11-06 15:10
2013.03.22
Небольшой вопрос по C++


15-1342182880
DevilDevil
2012-07-13 16:34
2013.03.22
OpenMP vs Multithread


2-1329812260
jacksotnik
2012-02-21 12:17
2013.03.22
Маска ввода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский