delphi - 如何使用Delphi和com接口(interface)更新ODT文档中的 "table of contents"

标签 delphi com openoffice.org ole openoffice-writer

首先是我试图实现的背景。 我基本上是在创建一个报告,并根据用户选择将其导出为不同的格式(odt、doc 和 pdf)。

所以我的方法是,以开放文档格式 odt 生成整个文档(在您完成规范和 XML 后,这非常整洁),然后我使用 openoffice com 接口(interface)以编程方式打开文档并保存以 Word 或 PDF 形式提供。

到目前为止,这一切都很完美,但我遇到了目录未更新的问题。

在 DOC 格式中这并不重要,因为用户可以随后手动执行此操作,但在 PDF 中用户没有此选项。

我录制了目录更新的宏并尝试使用它,但不知何故它不起作用。我没有给我错误消息,但它只是不触发.. 以下是万客隆:

sub Main

  dim document   as object
  dim dispatcher as object
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dispatcher.executeDispatch(document, ".uno:UpdateCurIndex", "", 0, Array())

end sub

基本上我用它来创建它:

oDispatcher := fOpenOffice.createInstance('com.sun.star.frame.DispatchHelper');

oDispatcher.executeDispatch(fDocument.CurrentController.Frame
                          , '.uno:UpdateCurIndex', '', 0
                          , VarArrayCreate([0, 0], varVariant));

这些变体:

fOpenOffice := CreateOleObject('com.sun.star.ServiceManager');
wProperties := VarArrayCreate([0, 0], varVariant);
wProperties[0] := MakePropertyValue('Hidden', True);
fDocument := fDesktop.loadComponentFromURL('file:///' + FileName
               , '_blank', 0, wProperties);`

在此过程中我是否忘记了什么?我没有列出整个源代码,它非常标准并且工作完美。只是带有“oDispatcher”的这两行不能完成这项工作。

最佳答案

您是否在事件中尝试过自动更新?

sub OnOpenDocumentUpdateAllDocumentIndexes
oIndexes = ThisComponent.getDocumentIndexes()

for i = 0 to oIndexes.getCount () - 1
 oIndexes (i).update
next i
end sub 

关于delphi - 如何使用Delphi和com接口(interface)更新ODT文档中的 "table of contents",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18755381/

相关文章:

postgresql - 如何从列中删除多余的字符?

delphi - 为什么应该避免在应用程序代码中使用 ClassType?

Delphi:带有内置包的 .exe:600kb,.exe + 外部 BPL:6MB。这是为什么?

c++ - 如何将 BSTR 与 c/c++ 中的字符串进行比较?

c# - 如何通过idl中的c++ com接口(interface)从C#传递bool

ruby - ruby 中有什么好的 OpenDocument 库吗?

c# - 使用 c# 以编程方式读取 Openoffice Calc (.ods)?

delphi - 扩展类时的抽象错误

delphi - 如何将 nil 传递给 var 参数?

c++ - 删除/编辑 ATL COM DLL 属性/方法