:: Не фоксом единым
Re: прочитать содержание 3 объектов ворда
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> так как там нет смысловых тегов
Так просто обычно не бывает ) Но вот триггерный механизм - ждем (среди шума тэгов) последовательность поступления только вот этих тэгов:
(по хорошему надо заталкивать тэги в стек, и выталкивать при приеме завершающего тэга, совпадающего с верхушкой стека, а может будет детектироваться и просто просто ловлей указанной последовательности... Только сбрасывать детектор при поступлении сигнала <w:p и <\w:p чтобы как-то синхронизироваться с целевым сигналом). Ниже ловимая последовательность, некоторые можно не ловить, но <v:shape - обязательно - это собственно шейп

- w:p (блок с шейпом, и наименованием)

- w:r (тэг с текстом шейпа)
- w:pict
- v:shape (собственно шейп)
- v:textbox (причем с текстом)
- v:txbxContent
- w:p
- w:r
- w:t содержит "Умная Василиса Премудрая"
- (завершающие тэги)

- w:r
- w:t содержит "Фамилия, Имя, Отчество_____________________________________________________________________________________________________"
... кстати, он с каким-то особенным атрибутом xml:space="preserve" ...
- (завершающие тэги)

- \w:p (конц блока с шейпом и наименованием)

Доб. Видно, что некоторые тэги повторяются, поэтому на каждое имя тэга заведем счетчики. Все счетчики сбрасываются по сигналу синхронизации (первый тэг чтобы узнавать который из них первый, счетчик тэгов w:p надо декрементировать на тэге \w:p тогда тэг w:p при состоянии счетчика 0 и будет "первый". Остальные счетчики, например, тэгов w:t, можно упростить, а именно считать только начальные тэги, тогда:
- w:t первый - содержит "Умная Василиса Премудрая"
- w:t второй - содержит "Фамилия, Имя, Отчество_____________________________________________________________________________________________________"

Надеюсь, не слишком путано обьяснил. Так строятся микропрограммы (для т.н. сигнальных процессоров), из элементарных соображений, в соответствии с видом сигнала, элементарными аппаратными средствами (только счетчики, и сравнители в данном случае). И на фоксе можно писать микропрограммы, или хоть эмулятор команд 8080



Исправлено 3 раз(а). Последнее : of63, 11.05.17 20:21
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
boba
Для тех файлов, что мне нужно обработать, это так

Владимир, скажу по простому. Фокс для такой задачи просто не самый подходящий инструмент (даже если нарисовать всё то о чём пишет Олег - а это уйма ненужных буковок программного кода). Равно как и доступ к документу через OLE ворда - далеко не лучший вариант.

Я взял приложенный документ из первого сообщения и в ворде просто "размножил" его на 4000 страниц (это даёт 28000 шейпов). docx занимает 640Кб, document.xml внутри "весит" примерно 29Мб. Мой несчастный ворд просто открывает такой документ с минуту (CPU time в таскменеджере), и кушает порядка 300Мб памяти...

Я никогда не писал ручных парсеров для такого рода XML файлов, и вообще ни разу "программно" не разбирал docx файлы. Но тем не менее за пару часов при помощи гугла и толики здравого смысла написал следующий код (скомпилировано под 4-й .net framework):

Я не вижу в нём ничего "ужасно сложного". Если убрать служебные конструкции, то "основа" это 10-15 достаточно прямолинейных, даже можно сказать "примитивных" строк кода.
Эта программка отрабатывает вышеописанный "тяжёлый" docx файл (естественно не "распаковывая" его предварительно никуда - т.е. прямо на лету вынимая нужные части из архива) за время меньшее 500мс - т.е. за ПОЛ СЕКУНДЫ. Потребляя при этом, согласно профилировщику, около 20Мб памяти (ну да, дотнет достаточно прожорлив до памяти даже в Hello World приложении), и генерируя на выходе 530Кб текстового файла с содержимым этих самых 28000 шейпов. Я даже заморочился на извлечение "сложно форматированного текста" - когда внутри шейпа будет текст с переносами (т.е. разные абзацы-параграфы в терминологии ворда) и/или форматированием. Конечно же сделал это максимально примитивно - просто сцепляя все элементы в одну строку... Для полноты статистики - полученный exe файл "весит" 7680 байт.

Я ни к чему не призываю, просто ещё раз повторюсь - следует искать для решения задачи подходящий инструмент, а не пытаться кувалдой "англицкую блоху" подковать.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: прочитать содержание 3 объектов ворда
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Я не вижу в нём ничего "ужасно сложного". Если убрать служебные конструкции, то "основа" это 10-15 достаточно прямолинейных, даже можно сказать "примитивных" строк кода.

XmlReader.Create(documentPart.GetStream()))

Синтаксис непонятен (То, что в конторе МС ХМЛ разбирают без встроенного общедоступного средства - это верю

Доб. Что оно возвращает (оно ничего не возвращает). И что делает?



Исправлено 1 раз(а). Последнее : of63, 12.05.17 00:43
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну, это кому как. Мне лично всё понятно Статический метод - чем-то похож на фоксовую "отдельноживущую" процедуру/функцию.

Впрочем, хозяин-барин. Можно и дальше прятать голову в песок аки страус

Цитата:
Доб. Что оно возвращает (оно ничего не возвращает). И что делает?
Возвращает - ссылку на объект XMLReader. Делает - ну этот самый объект что возвращает и "делает". Это "фабричный" метод.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 12.05.17 00:49
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
...если оно возвращает (что?), то вроде должен быть оператор = ... Может я неверно списал с исходного текста...

Доб. Что вы называете "фабрика" ? (почитаю в интернете)

Доб2. Игорь, шейпы прочитаны... Владимир и так их читал при помощи ворда, это не проблема. В программе на шарпе не потеряна связь шейп-заголовок?:
- "Умная Василиса Премудрая" - шейп
- "Фамилия, Имя, Отчество_____________________________________________________________________________________________________" - заголовок шейпа



Исправлено 2 раз(а). Последнее : of63, 12.05.17 08:48
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
of63
Что вы называете "фабрика" ?

К кому вопрос - к AdamAry? [sm128]
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
system.io.pakages
vs 2015 сборки у себя на компе нигде не обнаружил
Без этого use с таким содержанием просит добавить ссылку,
иначе сборка проекта не идет
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
system.io.pakages находится в WindowsBase.dll

of63
вроде должен быть оператор =
Он там есть
of63
В программе на шарпе не потеряна связь шейп-заголовок?:

Никакой связи с текстом нет и быть не может, т.к. это совершенно независимые сущности. Это НЕ заголовок шейпа, это просто текст, поверх которого весьма хаотически размещены шейпы. В ворде, кстати, тоже никакой связи соорудить не получится. Да и какая может быть связь, если над одним параграфом нарисованы два разных шейпа Шейпы на то и шейпы что плавают где хотят, и к тексту не привязаны.

Впрочем, если документ генерирует софт, то скорее всего можно просто определить "шаблон повторяемости" - через сколько шейпов будут повторяться искомые. Ну или, если уж совсем всё плохо, вынимать координаты шейпов (может быть все "ФИО" на определённом расстоянии от левого края листа находятся). Никакой другой связи с "прочим текстом" я не вижу.
В любом случае я писал не решение для задачи Владимира, а простой тест - показать насколько быстро можно разбирать "xml из docx файлов".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В тексте файла XML шейпы состоят в группе (в тэге w:p) вместе с текстами (w:t), например "ФИО" и шейп с "Умная Василиса" в одном тэге. Я подумал, может это что-то означает. В ворде связи шейпа и текста не нашел, хотя в интернете пишут про какие-то группы...
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Может и состоят - это, видимо, от настроек "обтекания" и "привязки" зависит (типа где "якорёк" нарисован, в то <p> и будет шейп вложен в xml-файле). Я пока баловался, так они так поразъезжались, что никакой связи и не осталось

Если на это опираться, ну можно начать разбор с <p> (абзацев) верхнего уровня (т.к. внутри самих шейпов тоже есть свои абзацы - в примере по одному короткому абзацу, но может то быть хоть целый роман ). Не имея "настоящего" файла (а точнее нескольких разных файлов, т.к. вероятно там есть различия) даже не предположу на что стоит опираться. М.б. вообще на размер (ширину и высоту) каждого шейпа Или даже на их шрифт...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Гулин Федор

Сообщений: 4640
Откуда: Минск
Дата регистрации: 24.10.2002
Игорю РЕСПЕКТ как обычно
было бы время сам бы глянул
правильно я понял что это нельзя засунуть в VFP Как вызовы com объекта Word
потому что это сидит в
using System.IO.Packaging;
using System.Xml;


var documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
using (var myPackage = Package.Open(docFileName, FileMode.Open, FileAccess.Read, FileShare.Read))
using (var outFile = File.CreateText(outFileName))




зы я вот такие фичи в ворде делал черзе поля (F9) так что каждый придумывает что хочет
но у меня больше было ексел. шаблонов а там есть именованные ячейки
Ratings: 0 negative/0 positive
Re: прочитать содержание 3 объектов ворда
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Почему ж нельзя? Оформляй данный код как ком-сервер (утилитой regasm регистрируй), или используй wwDotNetBridge и вперёд. Только смысл?


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 14 (Гостей: 14)

© 2000-2024 Fox Club 
Яндекс.Метрика