2024/10/13

DXL Step-by-Step:#41)インラインイメージの貼り付け

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 41 回です。しばらく表の話が続いたので少し流れを変えます。

今回はリッチテキストに直接貼り付ける画像についてまとめます。 ノーツクライアントでは、下図のようにプロパティで見るとソース欄に[インラインイメージ]と表示されるパターンですね。

DXL を使えば、リッチテキストに画像を貼った文書を作成することができます。また、文書から画像をダウンロードしてファイルに保存することも可能です。


インラインイメージの DXL

先ほどのリッチテキストを DXL で書き出すと次のようになります。

画像を表す png タグがあります。その配下には暗号化されたような文字列がテキストノードとして大量に出力されています。この構造は『#8)イメージリソース(設計要素)の DXL』で紹介した、イメージリソース内に保存されている画像データと同じですね。

画像データの1つ上は picture ノードとなっています。このノードは『#26)イメージリソースの DXL』で、リッチテキストにイメージリソースを配置する際に出てきました。

リッチテキストに配置したインラインイメージとイメージリソースの違いは、配下のノードが画像データか、リソースの参照 imageref かだけです。


サンプルプログラム

それでは、実際にインラインイメージを配置するプログラムを作成します。『#27)イメージリソースの表示』で作成したプログラムをベースに作業します。

エージェントをコピペして xSetDXL_ImageResource 関数を次の通り修正します。

Function xSetDXL_InlineImage(vddn As NotesDOMDocumentNode, vdenRT As NotesDOMElementNode, ByVal vsFileName As String)
   Dim denPar As NotesDOMElementNode
   Dim denPic As NotesDOMElementNode
   Dim den As NotesDOMElementNode
   Dim dtn As NotesDOMTextNode

   Dim nst As NotesStream
   Dim iType As Integer
   Dim iSizeX As Integer
   Dim iSizeY As Integer

   '画像ファイルの確認
   Set nst = xns.CreateStream()
   Call nst.Open(vsFileName)
   iType = xGetImageFileInfo(nst, iSizeX, iSizeY)

   If iType <> DXL_Image_Unknown Then

      '段落の作成
      Set den = vddn.CreateElementNode("par")
      Call den.SetAttribute("def", "1")
      Set denPar = vdenRT.AppendChild(den)

      '画像の作成
      Set den = vddn.CreateElementNode("picture")
      Call den.SetAttribute("width", CStr(iSizeX) & "px")
      Call den.SetAttribute("height", CStr(iSizeY) & "px")
      Set denPic = denPar.AppendChild(den)

      'インラインイメージの作成
      Set den = vddn.CreateElementNode(xGetImageNodeName(iType))
      Set den = denPic.AppendChild(den)

      '画像データセット
      Set dtn = vddn.CreateTextNode(StreamToBase64(nst))
      Call den.AppendChild(dtn)
   End If
End Function


画像ファイルの確認

xSetDXL_InlineImage 関数には、引数 vsFileName を追加しました。これはインラインイメージとして貼り付ける画像のファイル名です。指定したファイルは、関数の最初で画像の形式を確認しています。

画像ファイルを調査して、画像のフォーマットとサイズを返す関数 xGetImageFileInfo をコールしています。この関数は、『#13)イメージの形式とサイズの取得』で紹介しています。xGetImageFileInfo とサブ関数 xGetImageFileType をコピペします。


画像の作成

picture ノードの作成では、画像のサイズ width と height 属性を追加しています。イメージリソースを呼び出す場合はサイズ指定がなくても表示されたのですが、インラインイメージの場合は指定しないと画像が表示されませんでした。


インラインイメージの作成

インラインイメージの場合、画像の形式により作成するタグが変わります。画像ファイルに合致したタグ名を xGetImageNodeName 関数から取得し、ノードをを作成しています。

xGetImageNodeName 関数は次の通りです。

Function xGetImageNodeName(ByVal viImageType As Integer) As String
   Dim s As String

   If viImageType = DXL_Image_PNG Then s = "png"
   If viImageType = DXL_Image_GIF Then s = "gif"
   If viImageType = DXL_Image_JPEG Then s = "jpeg"

   xGetImageNodeName = s
End Function


画像データセット

画像データは Base64 でエンコードされた文字列を指定する必要があります。変換する関数 StreamToBase64 は『#10)イメージリソースの新規作成』で紹介しているので、コピペします。


呼び出し元の修正

xSetDXL_InlineImage 関数が完成したら、呼び出しもとを修正します。

Function xSetDXL(vdprs As NotesDOMParser)
         ・・・
   '段落定義
   Call xSetDXL_pardef(ddn, denRT)

   'インラインイメージの追加
   Call xSetDXL_InlineImage(ddn, denRT, "E:\411.PNG")
End Function

これでサンプルは完成です。実行するとこの記事の最初の画像のようにインラインイメージが貼り付けられたリッチテキストが作成されます。


まとめ

今回はインラインイメージをリッチテキストに追加する方法を紹介しました。LotusScript 標準の RichText クラスではできない機能ですので、これができるようになるとプログラム経由で作る文書の表現力が格段にアップしますね。


前回 DXL Step-by-Step


0 件のコメント:

コメントを投稿