Форум: "Основная";
Текущий архив: 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$+˜Р„Љby{QЧрYnмЧз‹І˜-яq1§D%Љ9ь¤RЕтХ…Ѕац’№7`ж"0ДФ8Ѓ»ўІ¶h& Uvf¶?ю©Щµл‡НОЕЁ
˜‡Jыи.ЎьPъаѓW„Г?€н—P ыЪўbb[1M+&Їаі®˜Трaр—ѓХqbґя}щaж¦}Ѕј RЫ\(C Їf41EE„6°ю¶№ёІ)¤јЫЏцҐ$і?µ‰ілЎv=n‡”№ьЅ]Бо¶Нѕxww{ЫґWM{7эv5Хё˜т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ш’>˜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#щ˜
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§дл˜П‹¦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Нџ ж˜зћ3З3—†uWM FU КЖвЕєін]{oс аAЋ‡љpAy¶…О˜=YЫ†*лЎаBЄ,$ќ$·”ghИm#Tu,±T
АН
ђw‰e˜ШW®фґ+ЅO7оІщ€#п6»п!СM‹НЊ•k|лРЊЧ!4Y,sу]вG†›LJ‘ймў дe…Т,\ЕГ¶ЩВw"МUS*ќЂЫIеФ|Р№єид\d]MРY|ьИ”2N_^cЉ˜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˜НЃ’Ё‘’±&ђf<Ајм^т {К!UХMІЩ-QRЦv‚ hИ&Щх__}эъЗЏњЭнЇ~?»z=›)ЖЩluЕ‹ј¬Ђ?wЗЙµ`BЩњ+6ыtU°;шНшпщ*c“Щ_Їј”ЬІ)l) ›Ѕ№В‰_e’ѕ Т)˜ВЗєЁ˜*sЈЊm?фхнu!TUSГOЬЁ\_ыEYЭАЇѕщЛм}`ЇМ-/
˜‹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Њ˜WZ•Яг/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.057 c