perl - 使用 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 张图片,则第二张显示在文档的末尾,但在第一张之前!
有什么我应该做但我忘记了吗?提前感谢您的帮助。
解决方案
我从来没有使用过 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
可能不会改变,仅基于问题中的代码。)
推荐阅读
- php - 动态 HTML 类 PHP 和 WordPress
- javascript - 复制到 clibboard + 之前有一些文本
- python - 运行命令行参数时Python cv2导入错误
- django - 尝试在 docker 容器中使用 PostgreSQL db 运行 Unittest 时出错
- performance - 如何检测 pytorch 中的所有 GPU/CPU 传输?
- authentication - 用于身份验证的 NetCore 3.1 Blazor WASAM 客户端 x509 证书
- bootstrap-4 - 引导表单选择及其验证的问题
- lua - Lua C - 有没有办法在 C 中保留一个值,但仍然没有垃圾收集?
- python - 实现回调 Tkinter
- python - 在 python 中打印时出现“TypeError:字符串索引必须是整数”;数量和单位列表字典