如何使用 Delphi 在 OpenOffice 文档中插入图像

How to insert image in OpenOffice Document using Delphi

我正在使用可接受的解决方案中提到的方法 How to Search and Replace in odt Open Office document? 使用 Delphi

搜索和替换 odt 文档中的文本

现在我的要求是用图片替换文字。 例如,我的 odt 文件的标签为 "SHOW_CHART=ID",我将从数据库中检索给定 ID 的图表作为图像文件,然后将其替换为 "SHOW_CHART=ID"。

所以我的问题是如何将文件中的图像插入到 ODT 文档中。 我发现另一个 link 问同样的问题但使用 java。 How to insert an image in to an openoffice writer document with java? 但我不知道 java.

以下代码改编自 Andrew Pitonyak's Macro Document 的清单 5.24。

ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
Desktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
NoParams := VarArrayCreate([0, -1], varVariant);
Document := Desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, NoParams);
Txt := Document.getText;
TextCursor := Txt.createTextCursor;
{TextCursor.setString('Hello, World!');}
Graphic := Document.createInstance('com.sun.star.text.GraphicObject');
Graphic.GraphicURL := 'file:///C:/path/to/my_image.jpg';
Graphic.AnchorType := 1; {com.sun.star.text.TextContentAnchorType.AS_CHARACTER;}
Graphic.Width := 6000;
Graphic.Height := 8000;
Txt.insertTextContent(TextCursor, Graphic, False);

有关将 OpenOffice 与 Pascal 结合使用的更多信息,请访问 https://www.freepascal.org/~michael/articles/openoffice1/openoffice.pdf

编辑:

此代码以插入SHOW_CHART=123SHOW_CHART=456为例。然后它找到这些字符串并用相应的图像替换它们。

Txt.insertString(TextCursor, 'SHOW_CHART=123' + #10, False);
Txt.insertString(TextCursor, 'SHOW_CHART=456' + #10, False);
SearchDescriptor := Document.createSearchDescriptor;
SearchDescriptor.setSearchString('SHOW_CHART=[0-9]+');
SearchDescriptor.SearchRegularExpression := True;
Found := Document.findFirst(SearchDescriptor);
While Not (VarIsNull(Found) or VarIsEmpty(Found) or VarIsType(Found,varUnknown)) do
begin
    IdNumber := copy(String(Found.getString), Length('SHOW_CHART=') + 1);
    Found.setString('');
    Graphic := Document.createInstance('com.sun.star.text.GraphicObject');
    If IdNumber = '123' Then
        Graphic.GraphicURL := 'file:///C:/path/to/my_image123.jpg'
    Else
        Graphic.GraphicURL := 'file:///C:/path/to/my_image456.jpg';
    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;

编辑 2:

嵌入在 Andrew 文档的下一部分,清单 5.26 中解释。

Bitmaps := Document.createInstance('com.sun.star.drawing.BitmapTable');
While...
    If IdNumber = '123' Then begin
        Bitmaps.insertByName('123Jpg', 'file:///C:/OurDocs/test_img123.jpg');
        Graphic.GraphicURL := Bitmaps.getByName('123Jpg');
    end Else begin
        Bitmaps.insertByName('456Jpg', 'file:///C:/OurDocs/test_img456.jpg');
        Graphic.GraphicURL := Bitmaps.getByName('456Jpg');
    end;