Skip to content

About

PDF・Word・Excel などを Markdown に変換する Windows デスクトップアプリ(MSI インストーラ付き)+ Claude Code / Cowork 用 Skill。Microsoft の markitdown を利用した非公式プロジェクト。

Resources

Stars

2 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

MarkItDown Studio

PDF・Word・Excel・PowerPoint などを Markdown に変換する Windows デスクトップアプリ。 Microsoft の markitdown を、ターミナルを開かずに 使えるようにしたもの。MSI インストーラで配布できる。

エージェント(Claude Code / Cowork)から同じ変換を使うための Skill も同梱している。

Microsoft とは関係のない非公式プロジェクトです。 Microsoft が作った・支援した・承認したものではありません。 変換エンジンとして Microsoft の markitdown ライブラリを利用しているだけです。 「MarkItDown」およびその他の商標は、それぞれの権利者に帰属します。


できること

  • ファイル・フォルダーをドラッグ&ドロップして一括変換
  • 変換結果をその場でプレビュー、コピー、.md で保存
  • エクスプローラーで右クリック →**「送る」**→ MarkItDown Studio
  • ライト/ダークテーマ(システム設定に追従)
  • 既定でネットワークに出ない(後述)

対応形式

分類 拡張子
文書 .pdf .docx .xlsx .xls .pptx .msg .epub .ipynb
テキスト .txt .text .md .markdown .json .jsonl .csv
マークアップ .html .htm .xml .rss .atom
画像 .jpg .jpeg .png(EXIF のみ。文字は読めない)
アーカイブ .zip(中身を再帰的に変換)

拡張子が表に無くても、文字コードを判別できるテキストなら変換できる。 ファイル選択ダイアログの「すべてのファイル」から選べばよい。

音声・動画(.wav .mp3 .m4a .mp4)の文字起こしは配布版に入っていません。 理由は ライセンス を参照。


入手方法

1. インストーラを使う(おすすめ)

Releases から MarkItDownStudio-x.y.z-win64.msi をダウンロードして ダブルクリックする。

  • 管理者権限は不要(UAC が出ない)
  • インストール先は %LocalAppData%\Programs\MarkItDownStudio
  • スタートメニュー・デスクトップ・「送る」の3か所にショートカットができる

コマンドから入れる場合:

msiexec /i MarkItDownStudio-1.0.0-win64.msi        # 画面あり
msiexec /i MarkItDownStudio-1.0.0-win64.msi /qn    # 無人
msiexec /x MarkItDownStudio-1.0.0-win64.msi        # アンインストール

版を上げた MSI を入れると、旧版は自動で置き換わる(同じ UpgradeCode を使っているため)。

2. ソースから起動する(インストール不要)

uv があれば1行で動く。

uv run --python 3.12 --with "markitdown[pdf,docx,xlsx,xls,pptx,outlook]" --with customtkinter `
  python src\mdstudio\app.py

3. 自分で MSI をビルドする

ビルド を参照。


ネットワークの扱い

既定ではネットワークに一切出ない。 設定の「ネットワークを使う変換を許可する」を オンにしたときだけ、URL・YouTube の変換が有効になる。

オフの間、URL は「スキップ」として扱われ、送信は発生しない。 業務書類を扱うならオフのままにすること。

OpenAI の画像説明と Azure Document Intelligence は、UI も依存パッケージごと入れていない。 経路そのものが存在しない。

ログに残るもの

%LocalAppData%\MarkItDown Studio\logs\app.log に、ファイル名・状態・所要時間・例外の型だけを書く。 変換した本文は書かない。 設定ファイルにも変換履歴は残さない。


エージェントから使う(Skill)

GUI 無しで同じ変換を使うための Skill を skill/markitdown/ に同梱している。 .docx や .xlsx のように、エージェントが直接読めない文書を読ませるためのもの。

導入

Claude Code(個人用)

Copy-Item -Recurse skill\markitdown "$env:USERPROFILE\.claude\skills\markitdown"

Claude Code(プロジェクト用) — リポジトリに同梱して共有する場合

New-Item -ItemType Directory -Force .claude\skills
Copy-Item -Recurse skill\markitdown .claude\skills\markitdown

Cowork — skill/markitdown/ を zip に固めてアップロードする。

使い方

python3 skill/markitdown/scripts/md_convert.py 資料/ -o out/ --head 300

結果は JSON のマニフェストで返り、本文は .md に書き出される (長大な文書でエージェントの文脈を埋めないための設計)。 詳細は skill/markitdown/SKILL.md。

markitdown が入っていない環境では、スクリプトが自動で仮想環境を作って導入する。 事前準備は要らない。


ビルド

前提

必要なもの 備考
Windows x64 MSI のビルドは Windows 専用
Python 3.12 3.13 以降ではビルドできない(後述)
uv winget install astral-sh.uv
PowerShell の実行ポリシー 既定で止まる場合は Set-ExecutionPolicy -Scope Process RemoteSigned

実行

.\build.ps1                 # 依存の導入から MSI まで
.\build.ps1 -SkipInstall    # 2回目以降(依存の導入を飛ばす)
.\build.ps1 -ExeOnly        # MSI を作らず実行ファイルだけ

成果物:

パス 内容
build\exe.win-amd64-3.12\ 実行ファイル一式(そのまま起動できる)
dist\MarkItDownStudio-1.0.0-win64.msi インストーラ(約 73MB)

build/ と dist/ は生成物なので Git では追跡していない。

手で回す場合

uv venv --python=3.12 .venv
$env:VIRTUAL_ENV = "$PWD\.venv"
uv pip install "markitdown[pdf,docx,xlsx,xls,pptx,outlook]" customtkinter cx_Freeze pillow
.venv\Scripts\python.exe tools\make_icon.py        # アイコン生成
.venv\Scripts\python.exe tools\make_notices.py     # 帰属表示の生成(ビルド前に必須)
.venv\Scripts\python.exe setup.py bdist_msi

企業ネットワークなどで TLS が途中で差し替えられている環境では、 uv pip install に --system-certs が要ることがある。 invalid peer certificate: UnknownIssuer で失敗したら付けてみること。

自己診断

同梱漏れは「起動して無言で消える」という形で出るため、追いにくい。 先に自己診断を回すこと。

.venv\Scripts\python.exe src\mdstudio\app.py --selftest          # 開発環境
build\exe.win-amd64-3.12\MarkItDownStudio.exe --selftest         # 凍結ビルド

Tcl/Tk・customtkinter のテーマ・magika のモデル・onnxruntime・pdfium.dll・ pdfminer の CMap・コンバーターの登録数・GPL バイナリの混入有無を順に確かめ、 1つでも欠ければ理由を出す。


設計上の注意点

開発を引き継ぐ人向け。どれも一度踏んだもの。

1. Python 3.13 以降ではビルドできない

cx_Freeze の bdist_msi は標準ライブラリの msilib を使うが、3.13 で削除された。 ビルド環境は 3.12 に固定する。実行環境としての制約ではない。

2. magika を library.zip に入れるとウィンドウが出る前に死ぬ

MarkItDown.__init__ は無条件に magika.Magika() を作る。magika は Path(__file__).parent / "models" / ... からモデルを探すので、zip の中だと MagikaError になる。base="gui" なのでエラーも見えない。

同じ理由で onnxruntime pypdfium2_raw pdfminer customtkinter mdstudio も ディスク側に置いている(setup.py の zip_exclude_packages)。

3. import markitdown に約2秒かかる

構築(MarkItDown())は 0.08 秒と安いが、import が重い。同期で読むと ウィンドウが2秒出ず、ダブルクリックしても無反応に見える。 ウィンドウを先に出し、import はワーカースレッドに回している。

4. コンソールへリダイレクトすると日本語が壊れる

これは markitdown の CLI を直接使うときの話。Windows の既定コードページ (cp932)のせいで markitdown a.pdf > out.md は文字化けする。-o を使うこと。 本アプリは常にファイルへ UTF-8 で書くので、この問題は起きない。

5. markitdown の例外はそのまま飛んでこない

コンバーターの例外は failed_attempts に飲み込まれ、全滅したときだけ FileConversionException になる。個々の理由は .attempts の中。 展開しないと利用者には「失敗」しか見えないので、engine.describe_failure() で 「どのコンバーターが何で落ちたか」まで出している。

6. ドラッグ&ドロップは ctypes で自前実装

tkinterdnd2 は tkdnd というネイティブバイナリの同梱が必要で、凍結ビルドで壊れやすい。 WM_DROPFILES を直接捕まえている(src/mdstudio/dnd.py)。

Tk のウィジェットは個別の HWND を持たないため、判定はウィンドウ全体になる。 ドロップゾーンは案内で、実際はどこに落としても受ける。

7. bind() は既存の結び付けを置き換える

行全体をクリック可能にするために子ウィジェットへ再帰的に bind() すると、 customtkinter のボタンが無反応になる。ボタンは <Enter> で内部フラグを立て、 <ButtonRelease-1> でそれを条件に command を呼ぶ作りだから。 必ず add="+" を使い、ボタンは対象から外すこと(src/mdstudio/widgets.py)。


既知の制約

  • Python 3.13 以降ではビルドできない(msilib 削除)。ビルド環境は 3.12 固定。
  • 音声・動画の文字起こしは配布版に入っていない。 pip で markitdown[audio-transcription] を入れた環境では使える。理由は下記ライセンス。
  • プラグインは MSI 版では動かない。 enable_plugins は importlib.metadata.entry_points で .dist-info を探すが、cx_Freeze は依存の .dist-info を出力しないため、常に0件で無言のまま何も起きない。
  • 画像・音声のメタデータ抽出には別途 exiftool が必要。 設定でパスを指定する。 未設定でも画像の変換自体はできる。
  • 画像の中の文字は読めない。 EXIF メタデータだけ。
  • .bmp .tiff .doc .xlsm は非対応。
  • 変換結果はテキスト解析向けであり、人が読むための高精度な文書変換ではない (上流 markitdown の但し書き)。

ライセンス

このアプリのソースコードは MIT License。LICENSE を参照。

Windows インストーラ(.msi)は 37 のサードパーティ製ライブラリを再頒布している。 それぞれの著作権表示とライセンス本文は THIRD-PARTY-NOTICES.md にまとめてある(tools/make_notices.py が実際のビルド内容から自動生成する)。

音声の文字起こしを外している理由

SpeechRecognition は音声変換に flac-win32.exe という GPLv2 のバイナリを同梱している。 GPLv2 は、バイナリを再頒布する者に対応するソースコードの提供を求める。 この実行ファイルは上流が配布するビルド済みバイナリで、どのソース改訂から作られたかを 特定できず、義務を確実に満たせない。そのため配布版からは機能ごと外した。

なお flac.exe は独立した実行ファイルとして呼び出されるだけなので、 MarkItDown Studio 自体が GPL になるわけではない。義務が生じるのは、 そのバイナリを配る行為そのものに対してである。

pip で markitdown[audio-transcription] を入れれば、各自の環境では利用できる。

アイコンについて

tools/make_icon.py が生成するアイコンは、Markdown の慣用的な意匠(角丸の枠・M・下向き矢印)を 幾何学的に描いたもの。Markdown Mark(Dustin Curtis 作、 CC0 / パブリックドメイン)と同系統の図案であり、画像そのものを転載してはいない。

About

PDF・Word・Excel などを Markdown に変換する Windows デスクトップアプリ(MSI インストーラ付き)+ Claude Code / Cowork 用 Skill。Microsoft の markitdown を利用した非公式プロジェクト。

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages