Вставка картинки в текстовый документ с помощью Perl Win32 :: OLE - PullRequest
0 голосов
/ 16 ноября 2018

Я разрабатываю инструмент для генерации документов Word с Win32 :: OLE в Perl CGI, и сталкиваюсь с проблемой, которую не могу решить: когда я вставляю картинку, она отображается в самом концесгенерированный документ, куда бы я ни попросил его вставить.

Вот пример кода, который объясняет мои опасения, где $ go_document - это мой документ Word и $ as_file путьв мой файл изображения:

$go_document->ActiveWindow->Selection->TypeText( "before the picture\n" );

my $last = $go_document->Paragraphs->Count;
my $para = $go_document->Paragraphs( $last );
$go_document->InlineShapes->AddPicture( WorkDir() . $as_file, 0, 1, $para->Range );

$go_document->ActiveWindow->Selection->TypeText( "after the picture\n" );

Результат включает в себя ожидаемые текстовые строки, но изображение показывает после второй.Более того, если я добавлю 2 картинки, вторая будет показана в конце документа, но перед первой!

Что-то мне нужно сделать, и я забыла?Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 16 ноября 2018

Я никогда не использовал Perl, поэтому я могу дать вам только псевдокод, основываясь на моих знаниях объектной модели Word и на том, что я вижу в коде в вопросе. Вместе с объяснением, приведенным ниже, этого, надеюсь, должно хватить, чтобы вы начали ...

Один из самых полезных объектов в объектной модели Word - Range. Думайте о диапазоне как о невидимом выделении, чтобы работать с ним. Код автоматизации может использовать несколько диапазонов, но может быть только один выбор, что является одной из причин полезности диапазонов. Другая причина заключается в том, что выполнение обычно быстрее и меньше мерцания экрана.

Если цель состоит в том, чтобы вставить рисунки в конец документа, то необходим диапазон, представляющий конечную точку документа. Например (псевдокод! Я не знаю, как указать член перечисления слов в perl):

my $endDocRange = $go_document->Content;
$endDocRange->Collapse(Word.WdCollapseDirection.wdCollapseEnd);

Подумайте об этом, как сначала выделите весь документ, а затем нажмите стрелку вправо, чтобы в конце документа вспыхнул мигающий курсор.

Объект $endDocRange затем используется в качестве целевого диапазона для изображения:

$go_document->InlineShapes->AddPicture( WorkDir() . $as_file, 0, 1, $endDocRange );

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

...