首页 > 解决方案 > 使用 perl Win32::OLE 在 word 文档中插入图片

问题描述

我正在开发一个在 Perl CGI 中使用 Win32::OLE 生成 Word 文档的工具,我遇到了一个我无法解决的问题:当我插入图片时,它会显示在生成文档的最后,我要求插入的任何地方。

这是一个示例代码,可以解释我的担忧,其中$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 张图片,则第二张显示在文档的末尾,但在第一张之前!

有什么我应该做但我忘记了吗?提前感谢您的帮助。

标签: perlms-wordwin32ole

解决方案


我从来没有使用过 perl,所以我只能根据我对 Word 对象模型的了解以及我在问题代码中看到的内容,给你伪代码。连同下面的解释,希望这足以让你继续......

Word 的对象模型中最有用的对象之一是Range. 为了使用它,可以将 Range 想象成一个不可见的选择。自动化代码可以使用多个范围,但只能有一个选择,这是范围有用的原因之一。另一个是执行速度通常更快,屏幕闪烁更少。

如果目标是在文档末尾插入图片,则需要一个表示文档端点的 Range。例如(伪代码!我不知道如何在 perl 中指定 Word Enumeration 的成员):

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

可以将其想象为首先选择整个文档,然后按右箭头以在文档的最后处看到一个闪烁的光标。

然后将该对象$endDocRange用作图片的目标范围:

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

如果再次运行上述代码,则应在文档末尾的第一张图片之后出现额外的图片。(但不能保证第一行中的文本最终会在哪里结束,因为Selection可能不会改变,仅基于问题中的代码。)


推荐阅读