4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

draw.ioの全ページを一括変換する

はじめに

draw.ioで作成した図の全ページを一括で画像ファイルに変換する方法をまとめました。

実行環境

  • Windows 10 Pro
    • バージョン1709
  • drawio-desktop
    • v 14.4.3
  • Python
    • 3.9.2 64bit

実装

ディレクトリ構成

imageフォルダ内にある.drawioファイルから.svgを作成します。
出力されるファイル名は{file_name}-{page_name}.svgになります

./
│  make.py
│
└─image
        sample1.drawio # 入力
        sample1-page1.svg # 出力
        sample1-page2.svg # 出力
        sample1-page3.svg # 出力
        sample2.drawio # 入力
        sample2-page 1.svg # 出力
        sample2-page 2.svg # 出力

コード

make.py
from pathlib import Path
import xml.etree.ElementTree as et
import subprocess


def get_output_path(file_path, page_name, file_type):
    stem = '-'.join([str(file_path.stem), page_name])
    suffix = '.' + file_type
    return file_path.with_name(stem).with_suffix(suffix)


def generate_image(file_path):
    DRAWIO = '"C:\Program Files\draw.io\draw.io.exe"'
    FILE_TYPE = 'svg'

    root = et.parse(file_path).getroot()

    for i in range(int(root.get('pages'))):
        page_name = root[i].get('name')
        # option
        f = ' '.join(['-f', FILE_TYPE])
        p = ' '.join(['-p', str(i)])
        o = ' '.join(['-o', '"' + str(get_output_path(file_path, page_name, FILE_TYPE)) + '"'])
        # run
        command = ' '.join([DRAWIO, '"' + str(file_path) + '"', '-x', f, p, o])
        subprocess.run(command)


if __name__ == '__main__':
    root_dir = Path.cwd()
    for i in root_dir.glob('image\\*.drawio'):
        generate_image(i.relative_to(root_dir))

解説

.drawioの読み出し

以下のように.drawioファイル内にはページ数pagesと各ページの名前nameの情報があります。
これをxml.etree.ElementTreeで読み出してファイル名を生成しています。

sample1.drawio
<mxfile modified="..." ... pages="3">
    <diagram name="page1" id="...">
        ...
    </diagram>
    <diagram name="page2" id="...">
        ...
    </diagram>
    <diagram name="page3" id="...">
        ...
    </diagram>
</mxfile>

python上ではファイル毎にpagesの数だけ生成処理を行います。

    root = et.parse(file_path).getroot()

    for i in range(int(root.get('pages'))):
        page_name = root[i].get('name') # ページ名を取得

.drawioファイルの各ページの生成方法

drawioをコマンドライン実行する方法はdraw.io をコマンドラインで実行して、画像ファイルをエクスポートするが参考になります。

-p, --page-index <pageIndex>で指定したページを変換することができます。

-a, --all-pagesはpdf生成のみ対応しているため、画像生成時は使用できないので注意しましょう。

例えば1ページ目を生成する時は以下のようになります。

コマンド
"C:\Program Files\draw.io\draw.io.exe" "image/sample1.drawio" -x -f svg -p 0 -o "image/sample1-page1.svg"

その他

ファイル名やページ名に空白が含まれる可能性があるため、ファイル名は""で囲うようにしています。

    '"' + str(file_path) + '"' # ""で囲う

""をつけない場合、以下の例ではsample2-page 1.svgではなくsample2-pageというファイルが生成されてしまいます。

コマンド
"C:\Program Files\draw.io\draw.io.exe" image/sample2.drawio -x -f svg -p 0 -o image/sample2-page 1.svg

参考

drawio-cli
draw.io をコマンドラインで実行して、画像ファイルをエクスポートする
draw.ioの全てのタブを一括で画像出力する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
4
Help us understand the problem. What are the problem?