【问题标题】:Inserting a picture in a word document with perl Win32::OLE使用 perl Win32::OLE 在 word 文档中插入图片
【发布时间】:2018-11-16 16:16:37
【问题描述】:

我正在开发一种在 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 张图片,则第二张显示在文档的末尾,但在第一张之前!

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

【问题讨论】:

    标签: perl ms-word win32ole


    【解决方案1】:

    我从未使用过 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 可能不会改变,仅基于问题中的代码。)

    【讨论】:

    • 非常感谢!我认为范围只是访问选择的另一种方式。现在很清楚,并且有效!
    • @JNM 很高兴它可以工作 :-) 由于您是 Stack Overflow 的新手:“感谢”回答问题的贡献的传统方式是单击答案左侧的复选标记.一旦您在网站上获得了一些“积分”,您就可以对您认为有帮助的任何贡献(问题和答案)进行投票。这可以让其他人了解贡献的质量,从而为网站增加价值。享受吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多