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)の文字起こしは配布版に入っていません。
理由は ライセンス を参照。
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 を使っているため)。
uv があれば1行で動く。
uv run --python 3.12 --with "markitdown[pdf,docx,xlsx,xls,pptx,outlook]" --with customtkinter `
python src\mdstudio\app.pyビルド を参照。
既定ではネットワークに一切出ない。 設定の「ネットワークを使う変換を許可する」を オンにしたときだけ、URL・YouTube の変換が有効になる。
オフの間、URL は「スキップ」として扱われ、送信は発生しない。 業務書類を扱うならオフのままにすること。
OpenAI の画像説明と Azure Document Intelligence は、UI も依存パッケージごと入れていない。 経路そのものが存在しない。
%LocalAppData%\MarkItDown Studio\logs\app.log に、ファイル名・状態・所要時間・例外の型だけを書く。
変換した本文は書かない。 設定ファイルにも変換履歴は残さない。
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\markitdownCowork — 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つでも欠ければ理由を出す。
開発を引き継ぐ人向け。どれも一度踏んだもの。
cx_Freeze の bdist_msi は標準ライブラリの msilib を使うが、3.13 で削除された。
ビルド環境は 3.12 に固定する。実行環境としての制約ではない。
MarkItDown.__init__ は無条件に magika.Magika() を作る。magika は
Path(__file__).parent / "models" / ... からモデルを探すので、zip の中だと
MagikaError になる。base="gui" なのでエラーも見えない。
同じ理由で onnxruntime pypdfium2_raw pdfminer customtkinter mdstudio も
ディスク側に置いている(setup.py の zip_exclude_packages)。
構築(MarkItDown())は 0.08 秒と安いが、import が重い。同期で読むと
ウィンドウが2秒出ず、ダブルクリックしても無反応に見える。
ウィンドウを先に出し、import はワーカースレッドに回している。
これは markitdown の CLI を直接使うときの話。Windows の既定コードページ
(cp932)のせいで markitdown a.pdf > out.md は文字化けする。-o を使うこと。
本アプリは常にファイルへ UTF-8 で書くので、この問題は起きない。
コンバーターの例外は failed_attempts に飲み込まれ、全滅したときだけ
FileConversionException になる。個々の理由は .attempts の中。
展開しないと利用者には「失敗」しか見えないので、engine.describe_failure() で
「どのコンバーターが何で落ちたか」まで出している。
tkinterdnd2 は tkdnd というネイティブバイナリの同梱が必要で、凍結ビルドで壊れやすい。
WM_DROPFILES を直接捕まえている(src/mdstudio/dnd.py)。
Tk のウィジェットは個別の HWND を持たないため、判定はウィンドウ全体になる。 ドロップゾーンは案内で、実際はどこに落としても受ける。
行全体をクリック可能にするために子ウィジェットへ再帰的に 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 / パブリックドメイン)と同系統の図案であり、画像そのものを転載してはいない。