![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 12.08.2009
Сообщений: 118
|
![]()
Создаю WordArt:
Word::ShapePtr wordArt = m_WordDocument->Shapes->AddTextEffect(Office::msoTextEffec t1, L"Param pam pam", L"Arial", 16, Office::msoFalse, Office::msoFalse, m_AppWord->CentimetersToPoints(1), m_AppWord->CentimetersToPoints(1)); задаю размер wordArt->PutWidth(CentimetersToPoints(3)) ; wordArt->PutHeight(CentimetersToPoints(1) ); здесь все хороошо. Ручками в документе редактирую мое "Param pam pam", убираю все буквы 'p' образуется текст без верхних и нижних выносных элементов "aram am am". При этом объект WordArt растягивается на всю высоту заданную ранее 3х1. Как задать учет верхнего и нижнего выносных элементов? Т.е. чтобы при редактировании фразы высота символов не изменялась. В прикреплении файл демонстрирующий данную проблему Верхний и нижний выносные элементы это, например: b,t,i,f - имеют верхний выносной элемент; q,p, - имеют нижний выносной элемент. a,w,e, s, o - не имеют данных элементов. Все большие символы имеют верхний выносной элемент ABCDEF |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 12.08.2009
Сообщений: 118
|
![]()
Существует программа "Nitro pdf" редактор pdf файлов. В ней есть возможность конвертации pdf файлов в doc. Повернутый pdf текст конвертируется в WordArt. Результат конвертации простенького файла в прикреплении.
Как видно из файла нужный эффект можно реализовать. Но, как? Пробовал: 1. Пересохранял данный файл в docx формат. docx - это заархивированный xml. Переименовываю docx в zip, открываю архив, в полученных файлах открываю document.xml. Нахожу свое "Param pam pam". 2. Таким же образом поступаю с файлом созданным моей программой. Т.е. у меня 2 файла document.xml, первый созданный "Nitro pdf", второй созданный мной. Смотрю отличия... Ниже привожу упрощенный вид xml файлов. В них удалено все что не относится к "param pam pam" и то, что у 2х версий xml одинаковое. Nitro PDF <w:r> <w ![]() <v:shape style="z-index:-1" o:allowincell="f"stroked="f"> <o:extrusion v:ext="view" autorotationcenter="t"/> <v:textpath string="Nitro"/> </v:shape> </w ![]() </w:r> MОЁ <w:r> <w ![]() <v:shape style="z-index:251658240" > <v:textpath trim="t" fitpath="t" string="Our"/> </v:shape> </w ![]() </w:r> Пробую менять атрибуты моего xml и подсовывать его в архив, архив переименовываю в docx, открываю. Положительный результат получаю при удалении из моего варианта атрибута trim="t". Не могу найти соответствие данному атрибуту в модели Word. Подскажите, что это может быть? |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
![]()
Вариант. Cоздайте "правильный" шейп вручную, откорректировав
VML в MSE (Alt-Shift-F11), маркируйте его. и сделайте невидимым ( Новые шейпы создавайте копированием на его базе. Т.е идея состоит в предварительном создании в документе VML template для ваших шейпов. А так как на самом деле Вы пишите на C++, а не на VBA, ничто не мешает сохранить документ как XML/HTML подправить VML и переоткрыть с сохранением как DOC ![]() Последний раз редактировалось Aent; 05.09.2009 в 03:40. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 12.08.2009
Сообщений: 118
|
![]()
Спасибо, Aent, Вы открыли мне Америку (Alt-Shift-F11). Было чувство, что все может быть проще
![]() Идея с шаблоном весьма интересна. Но не хочется его хранить, желательно создавать на лету. Существует программная возможность редактирования XML? Можете привести простенький пример доступа к объектам XML? Планирую создавать шейп как создавал и убирать из его тега атрибут trim="t". Как это лучше сделать? |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
![]()
Diego___, MSE к сожалению не поддерживает автоматизацию. Доступа к
HTML представлению документа через объектную модель Word 2003 то же нет. Максимум можно попробовать через Sendkey, но IMHO это не решение. Боюсь, максимум что я могу предложить, это динамическое создание файла шаблона с шейпом по макету, заданному в программе как константа. Потом шейп можно копировать или вставлять фрагмент с помощью поля INCLUDETEXT. Что нибудь вроде: {INCLUDETEXT "c:\\Example\\WordArt.xml" \c XML \* MERGEFORMAT} Можно ещё сохранить документ как HTML и внести изменения через DOM, но IMHO это медленный и тупиковый путь. Мне кажется что если уж править сохранённый HTML, то как простой текстовый файл. Есть ещё один непростой путь. Сделать вручную нужный шейп-шаблон забрать его в клипбоард. Сохранить через API содержимое Clipboard как бинарные данные и затем встроить этот код в программу. С тем, что бы она в нужный момент помещала шейп в буфер обмена. Я что то похожее несколько лет назад делал. Для фрагментов текста. Но опять же, IMHO, "овчинка не стоит выделки" А шаблон получается очень маленький см. аттачмент. Причём я не выбрасывал лишних строк. Последний раз редактировалось Aent; 07.09.2009 в 17:55. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
![]()
Я поджал код XML (c сохранением читабельности)
В примере в документ из текущего каталога документа вставляется шейп, заданный XML/VML описанием. Вставка осуществляется с использованием поля INCLUDETEXT. Обратите внимание на относитльную адресацию Последний раз редактировалось Aent; 07.09.2009 в 18:02. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 12.08.2009
Сообщений: 118
|
![]()
Спасибо, Aent. Вы мне сильно помогли.
Я не так давно занимаюсь Word-oм, VBA для меня загадка, не все из вышесказанного ясно представляю. Можете объяснить "Вставка осуществляется с использованием поля INCLUDETEXT. Обратите внимание на относительную адресацию" - это из XML/VML или VBA? INCLUDETEXT - что это? на С++ сделал так: VARIANT path; path.vt = VT_BSTR; path.bstrVal = ::SysAllocString(L"C:\\word tamplate.xml"); // Ваш xml Word::DocumentPtr m_WordDocument = m_AppWord->Documents->Open(&path); ... CComVariant firstShape(1); Word::ShapePtr wordArt = m_WordDocument->Shapes->Item(&firstShape)->Duplicate(); // Копирую исходный WordArt ... wordArt->TextEffect->FontSize = 20; wordArt->TextEffect->PutFontName(L"Times New Roman"); wordArt->TextEffect->PutText("Success"); wordArt->PutLeft(m_AppWord->CentimetersToPoints(5.f)); wordArt->PutTop(m_AppWord->CentimetersToPoints(3.f)); m_WordDocument->Shapes->Item(&firstShape)->Delete(); // Удаляю исходный WordArt требуемый эффект достигнут. |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
![]()
INCLUDETEXT это поле (элемент коллекции Fields) MS Word. Поля это вид
объектов Word. C помощью этого поля указывается источник для вставки текста в документ. Шейп который вы увидели в .doc в моём примере вставляется с помощью этого поля. Его код можно увидеть нажав Alt-F9 {INCLUDETEXT "{FILENAME \p }//..//wa.xml" \* MERGEFORMAT} Файл wa.xml ищется в том же каталоге что и исходный документ. Cинтаксис в этом случае не очевиден ![]() Фигурные скобки вводятся с помощью Ctrl-F9. Они не могут быть набраны (вставлены) как текст. Естественно, поля можно добавлять динамически методом .add |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 12.08.2009
Сообщений: 118
|
![]()
Столкнулся с еще одной проблемой.
На основе Вашего xml открываю документ Код:
Как после ->Duplicate() переместить WordArt на нужную страницу? Получается, копии у меня всегда на 1ой странице. Чуть ранее я использовал selection. Было все просто: переходил на нужную страницу и вставлял копию. От этого объекта пришлось отказаться. Мне нужно чтобы во время работы моего приложения корректно работал сам Word, т.е. чтобы мои действия не мешали пользователю изменять его документ. Мне известно как создать новый WordArt не на основе шаблона, передать последним параметром anchor - range в кот. вставляю новый шейп. Код:
|
![]() |
![]() |
![]() |
#10 | |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
![]() Цитата:
восстанавливать Selection? Вариант: Я не очень понимаю, что вам мешает переместить шейп через буфер. Но можно, как я предложил раньше, работать не с шейпом а с динамически добавляемым полем INCLUDETEXT. Добавляете поле для нужного ранга, обновляете и разрываете связь (unlink). В результате вы фактически добавите новый шейп на основе шаблона с привязкой к местоположению поля. Кстати, Александр, если не секрет а что вы пишете? PDF converter ? Последний раз редактировалось Aent; 11.09.2009 в 23:39. |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как в lable задать степень (нижний и верхний регистр) | Polotenchik | Общие вопросы Delphi | 17 | 17.07.2009 23:30 |
как задавать клавиши в Меню | StudentPolitech | Помощь студентам | 1 | 10.12.2008 02:17 |
не просто текст, а как word или wordArt | andrey4623 | Общие вопросы Delphi | 2 | 29.12.2007 21:11 |
Как задавать параметры в EXE ???? ПОМОГИТЕ! | UnD)eaD)Snake | Общие вопросы Delphi | 2 | 22.07.2007 17:28 |
КАК поместить ИКОНКУ программы в правый нижний угол панели(там где пуск)??? | micaell | Общие вопросы Delphi | 5 | 21.02.2007 19:58 |