Shujima Blog

Apple製品,技術系の話をするブログ

draw.io の個別PDF化 (1ページずつシート名をつけてエクスポート)

draw.io (Diagrams.net) のデータを個別にpdf化します。 python環境およびdraw.ioのデスクトップ版が必要です。

  • 仕様上1ページ目を飛ばしてしまいます。
    • コマンド上では1ページ目は0を指定するのですが、0にすると全ページが印刷されてしまいます。バグor仕様のようです
    • 1ページ目にいらないページを作って対処してください
  • デスクトップ版のインストールが必要です。
  • Windows版しか動作確認していません。
  • <draw.ioファイル名>-<シート名>の形で各シートが1枚ずつpdf化されます。

参考

以下の画像の変換を多大に参考にさせていただいております。 * 主要参考元:https://qiita.com/ryo_i6/items/6ebbeadd181da4d0b5b3 draw.ioの全ページを一括変換する * ヘルプ: https://qiita.com/u4da3/items/646cc46bff68b380cbfa draw.io をコマンドラインで実行して、画像ファイルをエクスポートする 詳細なセットアップなどは参考元をご覧ください。

セットアップ

  1. ローカルのdraw.ioアプリをダウンロードする https://github.com/jgraph/drawio-desktop/releases/
  2. Windows PowerShellを開く
  3. pythonを打ってenter
  4. Microsoft Storeのウインドウが出てきたらインストールを押す。出てこなかったら、何もしない
  5. PowerShellを閉じる
  6. 添付のソースコードを「drawio.py」というファイル名でどこかに保存する
  7. 同じディレクトリに「pdf」というフォルダを作る
  8. pdf化したい.drawioファイルを用意する
  9. 拡張子が付いていない場合、拡張子を「.drawio」にする
  10. 先ほど作ったpdfフォルダに.drawioファイルを入れる
  11. PowerShellを新しく開く
  12. cdコマンドで先ほどのディレクトリに移動する
  13. 「python .\drawio.py」を打つ
  14. Enterを押すと変換が始まる
  15. 完了

pdfフォルダ内に変換した後のpdfがある。

コード

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_pdf(file_path):
    DRAWIO = '"C:\Program Files\draw.io\draw.io.exe"' #draw io デスクトップ版の場所
    FILE_TYPE = 'pdf' #各種オプションの調整が必要だが、これを変更するとそれぞれの形式にできる

    root = et.parse(file_path).getroot() # xmlのroot draw.ioの場合は<mxfile>というタグ
    print(root.get('pages')) #debug
    print(range(int(root.get('pages')))) #debug

    # 1ページずつ印刷
    # ページ番号はdraw.io コマンドでもxml.etreeでも0から始まる。draw.ioのGUIでは1ページから
    for i in range(1, int(root.get('pages')) ):
        page_name = root[i].get('name') 
        # 各オプションの中身
        g = ' '.join(['-g', str(i)+'..'+str(i)])
        o = ' '.join(['-o', '"' + str(get_output_path(file_path, page_name, FILE_TYPE)) + '"'])
        # run
        command = ' '.join([DRAWIO, '"' + str(file_path) + '"', '-x', g, o])
        print(command) #debug
        subprocess.run(command) #コマンドの実行
 

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


# 参考
# 主要参考元:https://qiita.com/ryo_i6/items/6ebbeadd181da4d0b5b3 draw.ioの全ページを一括変換する
# ヘルプ: https://qiita.com/u4da3/items/646cc46bff68b380cbfa draw.io をコマンドラインで実行して、画像ファイルをエクスポートする
当ブログをご利用いただく際には免責事項をお読みください。