Вверх ↑
Этот топик читают: Гость
Ответов: 98
Рейтинг: 1
#1: 2024-08-13 16:43:23 ЛС | профиль | цитата
Всем привет!

Прошу помощи с извлечением данных из pdf.
Вопрос связан с распаковкой и упаковкой(после) данных блока "stream"-"endstream" файла pdf. Данные потока начинаются с "xњ".Согласно спецификации на формат с фильтром FlateDecode, данные сжаты в zlib/DEFLATE. Стандартный zlib или GZIP от Netspirit не распознают данные (Error 0, не подходит, судя по методу сжатия)...
Add(MainForm,2953706,21,105)
{
Width=880
Height=296
Point(onClose)
Point(onQueryEndSession)
}
Add(FileStream,8998070,112,224)
{
link(FileName,16558165:Value,[])
}
Add(BlockFind,9435204,231,287)
{
IncludeBlock=1
StartBlock="stream"
EndBlock="endstream"
link(onSearch,15103391:doConvert,[])
}
Add(Message,11613251,553,280)
{
link(Caption,12509947:Size,[(566,268)(514,268)(514,324)(461,324)])
}
Add(Button,2195079,133,287)
{
Left=45
Top=45
link(onClick,14896185:doConvert,[])
}
Add(Memory,16558165,112,175)
{
Default=String(D:\\Compressed.pdf)
}
Add(StreamConvertor,15103391,287,287)
{
Mode=7
link(onResult,6282760:doDeCompress,[])
}
Add(StreamConvertor,4723064,497,280)
{
Mode=6
Point(Data)
link(onResult,11613251:doMessage,[])
}
Add(ZLIB,6282760,350,280)
{
link(onStream,16400311:doEvent1,[])
}
Add(StreamConvertor,14896185,189,287)
{
Mode=6
Point(Data)
link(onResult,9435204:doSearch,[])
link(Data,4325135:Stream,[])
}
Add(MemoryStream,12509947,448,280)
{
link(onCopy,4723064:doConvert,[])
}
Add(Hub,1369762,70,224)
{
link(onEvent1,8998070:doOpen,[])
link(onEvent2,8998070:doClose,[])
}
Add(Hub,16400311,406,280)
{
link(onEvent1,12509947:doClear,[(434,286)(434,293)])
link(onEvent2,12509947:doCopy,[(434,293)(434,286)])
}
Add(MemoryStream,4325135,189,224)
{
Stream=[ZIPE902000078DA530D7071D335D433E5527DF4F8FC652E53050385FCA42C2E1B1B7DB7CC9C92D4227DB79CC4925497D4E4FC94547D9FD4BCF4920C054343533B3BAEE292A2D4C45CAE8A39A2A776F3353908B05E98B77EC7D2593BDEFDE2DAA2167573C619FE076F5C0D0F1DE23B723F7C76F0DCA496E3CCEA3763980E095E520839F75E313CC7D62B7EE7E1752D47E2279F978F3DB1D9F4C892E2E37587724CAE5CB8C23B33ADE7C29C33D766F21A57AB2EFBF56F59B453DC04D1734177F6792F504AE44ACD4B81DA0E64819C6B827076486541AABE5B7E5E897E7069520988031231D4774A2C4E050B7BA4E694A596642627EA3AE5E7A4E8BBE601BD969997AE1F9E99E798579C09E3037D0835DC18CDF080C4F4D4627DEFCC94E2680543A05C50ACBE737E695E898221428F119A1EE7C492C49CFC74885E0590894108C586582CD0F74D4DC94C74CAAF88064A1A28985A9AEA195928589818EA5958C6EA07A516E7971625A71683E209E8291065A8600231D6CE0E6842512AD041607B808ECB2B01F280AE3505BB1661B119C2E2E0CCAA540573FDA0FCFC120523B0364F97681B230B13234383344BD3A4C444630BCB144B5383A4240B734363F3C4D4E44483443BC22A62217E8A084A4DC396A4C2416108B43056DF332F25B502C4338B8525342333E474969C929398C2939E1292966271ECC481F3277E8833886A32DDC64C0EC5258945251545A9695CA606965CAAAAAEFE6E5C00F462FF11]
}


Форум мертвый, по сути.
Вопрос решен с pdf.

Редактировалось 5 раз(а), последний 2024-08-16 13:35:26
карма: 0

0
Ответов: 783
Рейтинг: 168
#2: 2024-08-19 20:37:27 ЛС | профиль | цитата
strannik_nebes писал(а):
Вопрос связан с распаковкой и упаковкой(после) данных блока "stream"-"endstream" файла pdf. Данные потока начинаются с "xњ".Согласно спецификации на формат с фильтром FlateDecode, данные сжаты в zlib/DEFLATE. Стандартный zlib или GZIP от Netspirit не распознают данные (Error 0, не подходит, судя по методу сжатия)...

Стандартный ZLIB прекрасно справляется с распаковкой сримов между stream и endstream в PDF фаилах.

Add(MainForm,14080331,161,266)
{
Width=880
Height=296
Point(onClose)
Point(onQueryEndSession)
link(onCreate,14896185:doConvert,[])
}
Add(BlockFind,9435204,252,280)
{
IncludeBlock=1
StartBlock="3C3C2F46696C7465722F466C6174654465636F64652F4C656E677468203131353E3E0A73747265616D0A"
EndBlock="0A656E6473747265616D0A"
link(onSearch,9676665:doStrCat,[])
}
Add(StreamConvertor,15103391,350,280)
{
Mode=1
link(onResult,97704:doDeCompress,[])
}
Add(StreamConvertor,14896185,210,280)
{
Point(Data)
link(onResult,9435204:doSearch,[])
link(Data,6715283:Stream,[])
}
Add(Memo,10167157,511,273)
{
Left=550
Top=160
Align=5
ScrollBars=3
}
Add(MemoryStream,6715283,210,224)
{
Stream=[255044462D312E350A25E2E3CFD30A352030206F626A0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E677468203131353E3E0A73747265616D0A789C15CABB0E82401005D09EAFB8A59AB8EEFA0AB4265AD998CC0FE0EC4531C2C20EC4DF579B539D6284C70327D95C02C211D22054CEEF21576C3D4A5FB9C3AE84C45F93CF1F5DC8B335C4A473C77EC26C34D4D0D40D99668CD09CCCD6990D337B25A6FAFEA65B425E9015CE52DCBE4BA022610A656E6473747265616D0A656E646F626A0A342030206F626A0A3C3C2F547970652F466F6E742F537562747970652F54797065312F42617365466F6E742F48656C7665746963612D426F6C642F456E636F64696E672F57696E416E7369456E636F64696E673E3E0A656E646F626A0A332030206F626A0A3C3C2F547970652F50616765732F4B6964735B2031203020525D2F436F756E7420313E3E0A656E646F626A0A322030206F626A0A3C3C2F547970652F436174616C6F672F50616765732033203020523E3E0A656E646F626A0A312030206F626A0A3C3C2F547970652F506167652F4D65646961426F785B20302030203539352E3238203834312E38395D2F5265736F75726365733C3C2F466F6E743C3C2F46312034203020523E3E3E3E2F506172656E742033203020522F436F6E74656E74735B2035203020525D3E3E0A656E646F626A0A362030206F626A0A3C3C2F53697A6520372F526F6F742032203020522F49445B3C32383432313066393562616133383964393530626238373133376165636130613E3C32383432313066393562616133383964393530626238373133376165636130613E5D2F547970652F585265662F46696C7465722F466C6174654465636F64652F575B2031203220305D2F496E6465785B203120365D2F4C656E6774682032363E3E0A73747265616D0A789C63646C61640C676454666438C6C8C0CFC8F81700152902DB0A656E6473747265616D0A656E646F626A0A7374617274787265660A3530390A2525454F460A]
}
Add(ZLIB,97704,406,273)
{
link(onStream,8784320:doConvert,[])
}
Add(StreamConvertor,8784320,462,273)
{
Mode=6
link(onResult,10167157:doAdd,[])
}
Add(StrCat,9676665,301,280)
{
Str1="C70A0000"
link(onStrCat,15103391:doConvert,[])
}


strannik_nebes писал(а):
Вопрос решен с pdf.

Хотелось бы посмотреть на твоё решение.

Вот неплохая статья о том, как извлекать текст из pdf -
https://habr.com/ru/articles/69568/

P.S. По моему, PDF самый неудобный формат для парсинга. И это очень мягко… Обычно матом.
карма: 15

1
Голосовали:strannik_nebes
Ответов: 98
Рейтинг: 1
#3: 2024-08-20 09:15:50 ЛС | профиль | цитата
Стандартный ZLIB прекрасно справляется с распаковкой сримов между stream и endstream в PDF фаqлах.

Подозревал, что это корректно работает через HEX из-за нечитаемых символов.

Хотелось бы посмотреть на твоё решение.

Использование сервисов. Например, для извлечения текста (конкретно для распознания известной таблицы) в формате Stext программа MuPDF. Консольный модуль модуль mutool (сейчас доступна версия 2.4.0 для Windows) https://mupdf.readthedocs.io/en/latest/mutool-extract.html.
Пример:
"x:\mutool.exe" convert -o output.stext input.pdf

Более мощное решение по созданию, на мой взгляд, coherentpdf:

Нарисовать изменяемую печать можно так через cmd (свой шрифт):
"x:\cpdf.exe" input.pdf -add-text "Подписи присутствуют\nЛист %Page" -linewidth 0.75 -outline -bottomleft "152 27" -justify-center -load-ttf Gost="C:\WINDOWS\FONTS\GOST_A.TTF" -font Gost -font-size 12 -color "blue" -line-spacing 1 AND input.pdf -add-rectangle "100 26" -outline -bottomleft "150 25" -midline -linewidth 0.75 -color "blue" -o "x:\out.pdf"
Извлечение данных в формат JSON (есть проблемы с кодировкой русских букв в ANSI, да и обнаружил ошибку в работе с русскими символами)
"x:\cpdf.exe" "x:\input.pdf" -output-json -utf8 -output-json-parse-content-streams -o "x:\out.json"

Нарисовать картинку по координатам и размерам (alpha-канал не поддерживается в png):
"x:\cpdf.exe" input.pdf -draw -draw-jpeg stamp="x:\input.jpg" -mscale "0 0 250 50" -image stamp -outline "x:\output.PDF" -o "x:\input.pdf"
"x:\cpdf.exe" input.pdf -draw -draw-png stamp="x:\input.png" -mscale "0 0 250 50" -image stamp -outline "x:\output.PDF" -o "x:\input.pdf"


P.S. По моему, PDF самый неудобный формат для парсинга. И это очень мягко… Обычно матом.

Бесспорно. Распознавание таблиц по координатам текста - та еще "песня". Попроще будет, если знаешь размеры таблицы, калибруясь по координатам первого столбца таблицы.

Редактировалось 22 раз(а), последний 2024-08-21 09:18:27
карма: 0

0
Ответов: 8921
Рейтинг: 823
#4: 2024-08-20 10:18:53 ЛС | профиль | цитата
strannik_nebes, у меня в NitroPro кнопка извлечения в Word и Excel есть, дополнительных программ и не надо

карма: 19

0
Ответов: 98
Рейтинг: 1
#5: 2024-08-20 10:35:25 ЛС | профиль | цитата
Леонид,
Я рад, но мне, в данном случае, нужна автоматизация процесса без участия человека в динамическом режиме. К тому же мои исходные данные ужасно распознаются программами, особенно со штампами, в котором центрируется таблица.

Gunta,
Интересно ,как можно это реализовать с JSON, судя по форуму, ты спец в этом...

Редактировалось 3 раз(а), последний 2024-08-20 10:38:29
карма: 0

0
Ответов: 783
Рейтинг: 168
#6: 2024-08-21 06:58:34 ЛС | профиль | цитата
strannik_nebes писал(а):
Более мощное решение по созданию, на мой взгляд, coherentpdf:

Да, неплохой инструмент, но цена $499(~50 тыс. рублей) за самую дешёвую лицензию – это перебор.
strannik_nebes писал(а):
Интересно ,как можно это реализовать с JSON,

Зачем? Пока не уловил в чём преимущество JSON по сравнению с другими форматами.
Попробовал вот это - https://github.com/flexpaper/pdf2json
Результат практически невозможно использовать, не говоря уже о каком-то универсальном решении.
карма: 15

0
Ответов: 98
Рейтинг: 1
#7: 2024-08-21 08:34:31 ЛС | профиль | цитата
Gunta, лицензия AGPL 3.0

Редактировалось 1 раз(а), последний 2024-08-21 08:34:53
карма: 0

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)