Вставка картинки в текстовый документ с помощью Perl Win32 :: OLE

65
7

Я разрабатываю инструмент для генерации документов 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 изображения, второе будет показано в конце документа, но перед первым!

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

спросил(а) 2021-01-19T13:13:22+03:00 8 месяцев назад
1
Решение
90

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

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

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

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

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

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

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

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

ответил(а) 2021-01-19T13:13:22+03:00 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема