MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Word の XMLを操作して画像ファイルを追加する

以前の投稿ではもともと画像が挿入されているドキュメントの画像を差し替える方法を紹介しました。

今回は新規で画像を追加する方法の準備です。 (Power Automateはまだ使わない)

mofumofupower.hatenablog.com

画像に関する情報の所在

まず画像そのものは、Wordをzipファイルにして解凍したあとの [ルート]>[word]>[media] に格納されています。

f:id:mofumofu_dance:20210816124203p:plain

ドキュメント内で画像を参照しているような箇所を見てみると、document.xml 内では以下のように書かれていました。

<w:r>
    <w:rPr>
        <w:noProof/>
    </w:rPr>
    <w:drawing>
        <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="15DEB4AD" wp14:editId="20FC2634">
            <wp:extent cx="1800000" cy="1800000"/>
            <wp:effectExtent l="0" t="0" r="0" b="635"/>
            <wp:docPr id="1" name="図 1"/>
            <wp:cNvGraphicFramePr>
                <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
            </wp:cNvGraphicFramePr>
            <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
                <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
                    <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
                        <pic:nvPicPr>
                            <pic:cNvPr id="1" name="025.png"/>
                            <pic:cNvPicPr preferRelativeResize="0"/>
                        </pic:nvPicPr>
                        <pic:blipFill>
                            <a:blip r:embed="rId4">
                                <a:extLst>
                                    <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                                        <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
                                    </a:ext>
                                </a:extLst>
                            </a:blip>
                            <a:stretch>
                                <a:fillRect/>
                            </a:stretch>
                        </pic:blipFill>
                        <pic:spPr>
                            <a:xfrm>
                                <a:off x="0" y="0"/>
                                <a:ext cx="1800000" cy="1800000"/>
                            </a:xfrm>
                            <a:prstGeom prst="rect">
                                <a:avLst/>
                            </a:prstGeom>
                        </pic:spPr>
                    </pic:pic>
                </a:graphicData>
            </a:graphic>
        </wp:inline>
    </w:drawing>
</w:r>

画像ファイルへの相対パスのようなものは発見できません。実はドキュメント内の図形とファイルの関係は別の場所に定義されています。

画像ファイルとのリレーション

画像や設定ファイルなどドキュメント本体以外との関連付けは [ルート] > [word] > [_rels] の中にある document.xml.rels というファイルに書かれています。

f:id:mofumofu_dance:20210816124953p:plain

f:id:mofumofu_dance:20210816125012p:plain

さらによく見ると、rId4という部分に画像ファイルへのパスが書かれていることが分かります。Target="media/image1.png"/>の部分。

ここまでで、画像ファイルを追加する場合には、ファイルそのものの他にこの関連付けを追加してあげればいいことが期待されます。

画像のサイズ

ドキュメント内では当然ですが、画像のサイズが指定されています。 この表現がdocument.xmlのどこに表れているかというと、下記の2箇所にあります。

<w:r>
    <w:rPr>
        <w:noProof/>
    </w:rPr>
    <w:drawing>
        <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="15DEB4AD" wp14:editId="20FC2634">
            <wp:extent cx="1800000" cy="1800000"/>
(中略)

                            <a:xfrm>
                                <a:off x="0" y="0"/>
                                <a:ext cx="1800000" cy="1800000"/>
                            </a:xfrm>
(後略)

このcx="xxxxx"が画像の幅を、cy="xxxxx"が画像の高さを表していました。試しに100mmの設定で保存すると、cx=3600000と設定されていました。

画像を変更してもこの値は変わらずでしたので、非常に粗い理解では

画像の高さ (幅) を 100mm にしたいときは cx="3600000" に設定する。あとはリニアで増減

と覚えておけばよさそうです。(実際にはEMUという長さの表現で、計算式もあるようです)

rId と id

rIdは関連付けを表す relationship id で、rId3とかrId20のように、他と被らず rId+数字 の形式になります。もう一つ、<pic:cNvPr id="1" name="025.png"/> にあるような id ですが、これは連番がふられています。

ただしどちらも必ずしも連続している必要はありません。 (rId=7の次がrId=100とかでもいい)

画像を追加する手順

以上を踏まえ、画像をドキュメント内に新規追加する場合には、以下の手順をふめばいいことが分かりました。

  1. [word]>[media]のフォルダに挿入する画像を追加する
  2. [word]>[_rels]>[document.xml.rels] に rId付きで画像へのパスを記載する
  3. [word]>[document.xml] の画像を挿入したい部分に以下のブロックを追加する。
<w:r>
    <w:rPr>
        <w:noProof/>
    </w:rPr>
    <w:drawing>
        <wp:inline distT="0" distB="0" distL="0" distR="0">
            <wp:extent cx="1800000" cy="1800000"/>
            <wp:effectExtent l="0" t="0" r="0" b="635"/>
            <wp:docPr id="N" name="図 1"/>
            <wp:cNvGraphicFramePr>
                <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
            </wp:cNvGraphicFramePr>
            <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
                <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
                    <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
                        <pic:nvPicPr>
                            <pic:cNvPr id="N" name="025.png"/>
                            <pic:cNvPicPr preferRelativeResize="0"/>
                        </pic:nvPicPr>
                        <pic:blipFill>
                            <a:blip r:embed="rIdM">
                                <a:extLst>
                                    <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                                        <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
                                    </a:ext>
                                </a:extLst>
                            </a:blip>
                            <a:stretch>
                                <a:fillRect/>
                            </a:stretch>
                        </pic:blipFill>
                        <pic:spPr>
                            <a:xfrm>
                                <a:off x="0" y="0"/>
                                <a:ext cx="1800000" cy="1800000"/>
                            </a:xfrm>
                            <a:prstGeom prst="rect">
                                <a:avLst/>
                            </a:prstGeom>
                        </pic:spPr>
                    </pic:pic>
                </a:graphicData>
            </a:graphic>
        </wp:inline>
    </w:drawing>
</w:r>

※ただし id="N"r:embed="rIdM"の部分は要変更。連番である必要はないので、適当に大きい数字から始めればよい。

これで新規の追加方法がわかったので、次回はこれを使ってPower Automate でドキュメントライブラリの画像を挿入してみたいと思います。