如何使用 Delphi 在 Openoffice 文档的页眉/页脚/表格中搜索文本标签并替换为图像

2024-03-08

我有打开的 Office 模板文档,我需要在其中搜索 [CHART=100] 等标签,并将其替换为驻留在 PC 上某个文件夹中的图像文件。

我正在使用上一个问题中提到的方法。如何使用 Delphi 在 OpenOffice 文档中插入图像 https://stackoverflow.com/questions/46191314/how-to-insert-image-in-openoffice-document-using-delphi.

Procedure ReplaceTextTagsWithImage(sFileTobeReplaced,ImageFile:string);
  var
    ServiceManager: Variant;
    Desktop: Variant;
    Document: Variant;
    NoParams : Variant;
    FileReplace: Variant;
    FileSearch : Variant;
    Txt : Variant;
    TextCursor : Variant;
    FileParams: Variant;
    Graphic : Variant;
    FileProperty,Imageproperty: Variant;
    afileurl,gurl : string;
    xinterface,xTextRange,curTextView : variant;
    ppoint : variant;
    SearchDescriptor,found : Variant;
    IdNumber : Integer;
    sNumber : string;
    Bitmaps : Variant;

    function CreateProperty(const AName: AnsiString; const AValue: Variant): Variant;
    begin
      Result := ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
      Result.Name := AName;
      Result.Value := AValue;
    end;

  begin
    Try
      ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
      Desktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
      FileParams := VarArrayCreate([0, 0], varVariant);
      FileParams[0] := CreateProperty('Hidden',True); {hide Document}
      afileurl := 'file:///'+sFileTobeReplaced;
      Document := Desktop.loadComponentFromURL(afileurl, '_blank', 0, FileParams);
      Txt := Document.getText;
      TextCursor := Txt.createTextCursor;
      SearchDescriptor := Document.createSearchDescriptor;

      SearchDescriptor.setSearchString('[CHART=[0-9].*]');
      SearchDescriptor.SearchRegularExpression := True;
      Found := Document.findFirst(SearchDescriptor);
      Bitmaps := Document.createInstance('com.sun.star.drawing.BitmapTable');
      While Not (VarIsNull(Found) or VarIsEmpty(Found) or VarIsType(Found,varUnknown)) do
      begin
         sNumber := String(Found.getString);
         sNumber := copy(String(Found.getString), Length('<CHART=')+1 );
         sNumber := copy(Trim(sNumber),1,length(sNumber)-1);
         Found.setString('');
         Graphic := Document.createInstance('com.sun.star.text.GraphicObject');
         gurl := 'file:///'+ImageFile;
         if not Bitmaps.hasbyname(sNumber+'_Image') then
            Bitmaps.insertByName(sNumber+'_Image', gurl);
         Graphic.GraphicURL := Bitmaps.getByName(sNumber+'_Image');
         Graphic.AnchorType := 1; {com.sun.star.text.TextContentAnchorType.AS_CHARACTER;}
         Graphic.Width := 6000;
         Graphic.Height := 8000;
         TextCursor.gotoRange(Found, False);
         Txt.insertTextContent(TextCursor, Graphic, False);
         Found := Document.findNext(Found.getEnd, SearchDescriptor);
      end;
      FileParams[0] := CreateProperty('Overwrite',True);
      Document.storeAsURL(afileurl, FileParams);
      Document.Close(True);
      Try
        Desktop.Terminate;
      except
      end;
    Finally
      Document := Unassigned;
      Desktop := Unassigned;
      ServiceManager := Unassigned;
    end;
  end;


  procedure TForm6.Button3Click(Sender: TObject);
  var
    sFileToBeReplaced : String;
    sImageFile : String;
  begin
    sFileToBeReplaced := edOOFile.Text;
    sImageFile := edImageFile.Text;
    Try
      ReplaceTextTagsWithImage(sFileToBeReplaced,sImageFile);
      ShowMessage('Success');
    Except
      on E: Exception do
      ShowMessage(E.Message);

    End;
  end;

当标签文本不在页眉/页脚/表中时,此代码工作正常,但是如果我在页眉/页脚/表中定义标签,则会出现错误“com.sun.star.uno.RuntimeException:”

TextCursor.gotoRange(Found, False); 

我不确定如何在搜索和替换中引用范围。

请建议如何实现它。


标题、表格等都有自己的文本对象,因此主文档的文本对象将不起作用。相反,从以下位置获取文本对象和光标Found.

另外,删除.从正则表达式匹配多个数字而不是多个数字。并且括号必须是字面意思。

这是工作基本代码。

Sub ReplaceTextTagsWithImage
    Document = ThisComponent
    Bitmaps = Document.createInstance("com.sun.star.drawing.BitmapTable")
    ImageFile = "C:/google_wht.gif"
    SearchDescriptor = Document.createSearchDescriptor()
    SearchDescriptor.setSearchString("\[CHART=[0-9]*\]")
    SearchDescriptor.SearchRegularExpression = True
    Found = Document.findFirst(SearchDescriptor)
    Do While Not IsNull(Found)
        TextCursor = Found.getText().createTextCursor()
        TextCursor.gotoRange(Found, False)
        Graphic = Document.createInstance("com.sun.star.text.GraphicObject")
        gurl = "file:///" & ImageFile
        gname = sNumber & "_Image"
        if Not Bitmaps.hasbyname(gname) Then
            Bitmaps.insertByName(gname, gurl)
        End If
        Graphic.GraphicURL = Bitmaps.getByName(gname)
        Graphic.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
        Graphic.Width = 6000
        Graphic.Height = 8000
        TextCursor.getText().insertTextContent(TextCursor, Graphic, False)
        Found = ThisComponent.findNext( Found.End, SearchDescriptor)
    Loop
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Delphi 在 Openoffice 文档的页眉/页脚/表格中搜索文本标签并替换为图像 的相关文章

  • delphi中生成随机数

    我想在delphi中创建一个随机数并将其分配给文件作为文件名 我设法做到了这一点 但是当我单击按钮生成数字时 它总是以 0 开头 知道如何修复它 procedure TForm1 Button1Click Sender TObject va
  • DELPHI win32 的 ORM [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道 Delphi Win32 的 ORM 或类似的东西吗 Marco Cantu 是 Insta
  • 在主表单之前显示登录表单

    我在表单之间导航时遇到问题 我使用 Delphi XE5 创建了一个 Android Firemonkey 移动应用程序 我目前有一个登录表单和主表单 现在我想要有关如何处理登录表单以显示在主表单之前的建议 在 项目选项 中的表单下 选择要
  • 如何使用 Delphi Sydney 10.4.2 和 Edge Webbrowser 组件获取 HTML SOURCE

    I have TEdgeBrowser在德尔福 10 4 2 中 我想从 HTML 代码中提取基于 RegEx 的字符串 在过去 这是可能的TWebBrowser 仅适用于 IE 11 或更低版本 作为 selectedEngine 但我的
  • 如何在 TList 中存储动态数组?

    我需要存储未知数量的组 每个组都有未知数量的元素 项目 这是我的 小组 TGroup array of Integer lt dynamic array as you can see 我想使用 TList 来保存我的组 我的想法是 我可能想
  • 如何使用 jQuery 和“长轮询”通过 Indy HTTP 服务器动态更新 HTML 页面?

    我读过这篇文章使用 JavaScript 和 jQuery 的简单长轮询示例 http techoctave com c7 posts 60 simple long polling example with javascript and j
  • Indy FTP 传输类型

    我正在使用 IdFTP Indy 10 组件从远程位置下载一些文件 zip 和 txt 在获取每个文件之前 我将 TransferType 设置为二进制 IdFTP TransferType ftBinary IdFTP Get ASour
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 如何允许表单接受文件删除而不处理 Windows 消息?

    在 Delphi XE 中 我可以允许我的表单接受文件 拖放 但不必处理裸窗口消息吗 您不需要处理消息来实现这一点 你只需要实施IDropTarget并打电话RegisterDragDrop RevokeDragDrop 这真的非常非常简单
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 将记录转换为序列化表单数据以通过 HTTP 发送

    有没有办法转换此记录 TError record code Word message String end TState record caption String address Cardinal counters TArray
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • Delphi DataSnap REST 服务器从 TStream 返回 JSON 数组,而不是二进制

    我有一个与 Android 客户端通信的 REST 服务器 我将它从 XE3 ish 升级到 Berlin 其中一个服务器方法返回一个包含 jpeg 的 TStream 并且工作得很好 很高兴将图像作为二进制图像返回 升级到 Berlin
  • 如何追踪手柄泄漏?

    在我的一个应用程序中 我观察到句柄数量不断增加 在不使用应用程序的情况下 该数字大约每秒增加一次 因此后台处理代码的某些部分一定存在句柄泄漏 我如何追踪此类泄漏 有什么工具可以帮助解决这个问题吗 跟踪句柄泄漏时要寻找哪些模式 导致手柄泄漏的
  • Delphi XE5 REST/Android 客户端“会话已过期”

    我有一个REST Server与Android Client 都在Deplhi Xe5 Android客户端成功连接Rest服务器 在我的服务器中我有一个TDSHttpWebDispatcher with SessionTimeout 12
  • 在TImageViewer中,如何获取用户点击图片的位置?

    在TImageViewer控件中 用户可以缩放或平移图片 我的问题是 当用户点击图片时 如何获取用户在图片上的点击位置 尤其是用户可以对图片进行放大 缩小或平移之后 如何获取对应的图片点击位置呢 As shown below How to
  • 使用 TStringList 的分隔符解析字符串,似乎也解析空格(Delphi)

    我有一个简单的字符串 由某个字符分隔 比如说逗号 我应该能够创建一个 TStringList 并将其分隔符设置为逗号 然后将 DelimitedText 设置为我想要解析的文本 并且应该自动解析它 问题是 当我查看输出时 它还包含空格作为分
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • Delphi 流畅的界面

    使用上有什么优点和缺点流畅的界面 http en wikipedia org wiki Fluent interface在德尔福 流畅的界面应该会增加可读性 但我对此有点怀疑one包含很多链式方法的长 LOC 是否存在编译器问题 是否存在任

随机推荐

  • 根据输入字段的值更改文本颜色或背景[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Javascript 更改背景颜色 https stackoverflow com questions 197748 how do i change the background color
  • CQRS - 如何对场景执行系统进行建模

    我最近开始为我即将启动的一个绿地项目研究 CQRS 和 DDD 我研究了 Udi Dahan Greg Young Mark Nijhof 等人的大量资料 这些确实非常有帮助 我想我对这些概念有了很好的理解 但是 我仍然有一些关于如何将这些
  • Android:如何将 ActionBar“Home”图标更改为应用程序图标以外的其他图标?

    我的应用程序的主图标在一张图像中由两部分组成 一个徽标和其下方的几个字母 这对于应用程序的启动器图标效果很好 但是当图标出现在 ActionBar 的左边缘时 字母会被切断 看起来不太好 我想为 ActionBar 提供一个单独版本的图标
  • 笨拙地计算一组递增数字之间的差异,有更漂亮的方法吗?

    下面的代码工作得很好 但看起来很冗长 肯定有更优雅的方法来计算这个吗 我的想法是 我有一个包含 100 个递增时间戳的列表 我想查看这些时间戳并计算每个时间戳之间的平均时间 下面的代码可以运行 但我确信像这样反转列表确实效率很低 有什么建议
  • 替换除正数/负数之外的所有内容

    对于替换所有正数 许多问题已经得到解答 但是 我找不到任何保留正数和负数的答案 我想替换所有非数字 正数或负数 的内容 输出应如下所示 例如 0 success id 1234 gt 0 1234 and 10 failure id 234
  • Composer 从同一存储库上的另一个分支拉取依赖项

    我有以下 Composer 1 6 5 设置 require CRMPicco GolfBundle dev golf bundle repositories type git url email protected cdn cgi l e
  • 使用 VB.NET 的秒表循环

    我想使用 VB NET 创建一个带有此接口的简单计时器 我想按 Button1 并开始在文本框中计算秒数 我不想使用计时器组件 因为它不提供高分辨率 https stackoverflow com questions 10470276 my
  • 如何使用Content Provider实现复杂的查询?

    我问这个问题是因为我不太确定如何与 Android 内容提供商合作 我的数据库子集包含 8 个表 我需要创建复杂的查询来获取一些数据 我的内容提供程序可以很好地处理简单的查询 例如 我的表上有一个 PersonPersonModel jav
  • 检查 JavaScript 中的全局属性/函数是否已被覆盖

    JavaScript 可以轻松覆盖全局对象的属性和函数 我想找到一种方法来检查全局属性的原始版本是否已被替换 考虑有人将其放入 HTML 中 如果 myscript js 在某处调用encodeURIComponent 函数 它现在的行为将
  • 将 XX:XX AM/PM 转换为 24 小时制

    我搜索过谷歌 但找不到如何获取字符串 xx xx 上午 下午 例如下午 3 30 并将其更改为现在的 24 小时 例如 前一个时间是 15 30 我研究过简单地使用 if then 语句来操作字符串 但它看起来非常乏味 有什么简单的方法可以
  • 覆盖 Spring 表单错误消息

    在 Spring 中如何覆盖默认表单错误消息 我正在使用一个Validator和一个属性文件来添加我自己的错误消息 但是 例如 如何覆盖因转换 编码错误而打印的消息 它们似乎是自动生成的 我认为对用户没有帮助 Failed to conve
  • 如何优化查找相关性的极其缓慢的 MySQL 查询

    我有一个非常慢 通常接近 60 秒 的 MySQL 查询 它试图找到用户对一项民意调查的投票方式与他们对所有先前民意调查的投票方式之间的相关性 基本上 我们收集在给定民意调查中投票给某一特定选项的每个人的用户 ID 然后 我们查看该小组如何
  • 打开 dired 并选择与前一个缓冲区关联的文件?

    假设我正在编辑blah txt使用 Emacs 我决定打开dired以重命名文件 https stackoverflow com questions 384284 can i rename an open file in emacs 384
  • 如何使用 RxJS 对数据变化做出“反应”?

    RxJS 初学者 我在使用 RxJS 保存和跟踪数据更改时遇到问题 假设我在小视图 小部件中构建我的应用程序 每个视图 小部件都有自己的状态 并且应该对数据更改执行操作 我怎么做 更具体的例子 假设我有一个名为Widget and Widg
  • Autofac 和 Quartz.Net 集成

    有没有人有整合经验autofac and 石英网 如果是这样 最好在哪里控制生命周期管理 IJobFactory IJob 的执行中还是通过事件侦听器 现在 我正在使用自定义 autofacIJobFactory来创建IJob实例 但我没有
  • 在新门户中为辅助角色配置远程桌面

    我在新的 Windows Azure 门户中配置远程桌面连接时遇到问题 创建了一个新的工人角色 配置了远程桌面连接的过期时间 导出并上传生成的证书 发布了工作者角色 在新的 Windows Azure 门户 manage windowsaz
  • ASP.NET C# - 在服务器上保存文件流

    我有初学者的问题 如何将文件流保存到服务器上的文件 我懂了 var source Request QueryString src WebClient webclient new WebClient using Stream stream w
  • 即使使用 where 子句,“SELECT COUNT(*)”也很慢

    我试图弄清楚如何优化 MySQL 中非常慢的查询 我没有设计这个 SELECT COUNT FROM change event me WHERE change event id gt 1212281603783391 COUNT 32240
  • 如何通过蓝牙麦克风录制音频

    我正在尝试通过蓝牙耳机麦克风录制音频 但我只能听到音频 但无法通过蓝牙麦克风录制音频 而是可以从移动麦克风录制语音 我正在使用下面的代码 IntentFilter newintent new IntentFilter newintent a
  • 如何使用 Delphi 在 Openoffice 文档的页眉/页脚/表格中搜索文本标签并替换为图像

    我有打开的 Office 模板文档 我需要在其中搜索 CHART 100 等标签 并将其替换为驻留在 PC 上某个文件夹中的图像文件 我正在使用上一个问题中提到的方法 如何使用 Delphi 在 OpenOffice 文档中插入图像 htt