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_pdf_export.py」というファイル名でどこかに保存する
  7. 同じディレクトリに「drawio_pdf_export」というフォルダを作る
  8. pdf化したい.drawioファイルを用意する
  9. 拡張子が付いていない場合、拡張子を「.drawio」にする
  10. 先ほど作ったpdfフォルダに.drawioファイルを入れる
  11. PowerShellを新しく開く
  12. cdコマンドで先ほどのディレクトリに移動する
  13. 「python .\drawio_pdf_export.py」を打つ
  14. Enterを押すと変換が始まる

以上で完了

  1. ローカルのdraw.ioアプリをダウンロードする https://github.com/jgraph/drawio-desktop/releases/
  2. Windows PowerShellを開く
  3. pythonを打ってenter
  4. Microsoft Storeのウインドウが出てきたらインストールを押す。出てこなかったら、何もしない (この操作はPythonの初回インストール時のみ必要です。よって環境によっては出てこないことがあります。)
  5. PowerShellを閉じる
  6. 添付のソースコードを「drawio_pdf_export.py」というファイル名でどこかに保存する
  7. 同じディレクトリに「drawio_pdf_export」というフォルダを作る
  8. pdf化したい.drawioファイルを用意する(Web版draw.ioからダウンロードする場合は画像のようにSave as→Deviceを選ぶとダウンロードされます。
  9. 拡張子が付いていない場合、拡張子を「.drawio」にする
  10. 先ほど作ったpdfフォルダに.drawioファイルを入れる
  11. PowerShellを新しく開く
  12. cdコマンドで先ほどのディレクトリに移動する
  13. 「python .\drawio_pdf_export.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('drawio_pdf_export\\*.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 をコマンドラインで実行して、画像ファイルをエクスポートする
当ブログをご利用いただく際には免責事項をお読みください。