Claude Code x python-docx で業務マニュアル・手順書を自動生成する完全ガイド
Claude Code + python-docxで業務手順・操作マニュアルを自動生成・更新。スクリーンショット自動挿入・目次自動生成・版管理まで自動化する実践ガイド。マニュアル作成工数を90%削減。
目次 クリックで開く
|
blog

▲ Claude Codeが実際に生成した実行結果
システム更新のたびにマニュアル更新で丸一日かかっていた
情報システム担当の久保です。社内システムを更新するたびに操作マニュアルの更新が必要で、スクリーンショットを撮り直して、手順を書き直して……丸一日の作業でした。Claude Codeでコード・設定ファイルからマニュアルを自動生成できるようになり、更新工数が90%削減されました。
✅ YAML/JSONの手順定義からWord自動生成
✅ スクリーンショットの自動挿入・番号付け
✅ 目次・索引の自動生成
✅ 版番号・更新履歴の自動管理
✅ PDF変換・社内ポータル自動アップロード
STEP 1:YAML定義から手順書の骨格を自動生成する
手順をYAMLで定義するだけで、Wordの手順書を自動生成します。
各ステップにはタイトル・説明・注意点・スクリーンショットパスを含めます。
import yaml
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
MANUAL_YAML = """
title: "受発注システム 操作マニュアル"
version: "3.2"
updated: "2026-04-26"
author: "情報システム部"
sections:
- title: "ログインと初期設定"
steps:
- no: 1
title: "システムにアクセスする"
description: "ブラウザでシステムURLにアクセスします。推奨ブラウザはChromeです。"
screenshot: "screens/login.png"
note: "社外からのアクセスはVPN接続が必要です。"
- no: 2
title: "ユーザーIDとパスワードを入力する"
description: "社員番号をユーザーIDとして入力し、初期パスワードを入力してください。"
screenshot: "screens/login_form.png"
warning: "初回ログイン後は必ずパスワードを変更してください。"
"""
manual = yaml.safe_load(MANUAL_YAML)
doc = Document()
# タイトルページ
title_p = doc.add_heading(manual["title"], 0)
title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph(f"バージョン: {manual['version']} | 最終更新: {manual['updated']} | 作成: {manual['author']}")
doc.add_page_break()
# 各セクション・ステップを自動生成
for sect_idx, section in enumerate(manual["sections"], 1):
doc.add_heading(f"{sect_idx}. {section['title']}", 1)
for step in section["steps"]:
doc.add_heading(f" 手順 {step['no']}: {step['title']}", 2)
doc.add_paragraph(step["description"])
# スクリーンショット挿入
if step.get("screenshot"):
try:
doc.add_picture(step["screenshot"], width=Inches(5.5))
doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.CENTER
cap = doc.add_paragraph(f"図 {sect_idx}-{step['no']}: {step['title']}")
cap.alignment = WD_ALIGN_PARAGRAPH.CENTER
cap.runs[0].font.size = Pt(10)
except: doc.add_paragraph(f"[スクリーンショット: {step['screenshot']}]")
if step.get("note"):
p = doc.add_paragraph(); r = p.add_run(f"💡 ポイント: {step['note']}"); r.font.color.rgb=RGBColor(0x15,0x65,0xC0)
if step.get("warning"):
p = doc.add_paragraph(); r = p.add_run(f"⚠️ 注意: {step['warning']}"); r.font.color.rgb=RGBColor(0xDC,0x26,0x26)
doc.save(f"manual_v{manual['version']}.docx")
print(f"マニュアル生成完了: v{manual['version']}")
YAMLで定義した手順からWordマニュアルが自動生成されました。見出し・手順説明・スクリーンショット・注意事項が整然と配置されています。

STEP 2:目次を自動生成してページ番号を付ける
マニュアルの目次とページ番号を自動で生成します。
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
def add_toc(doc):
# 目次フィールドを挿入
para = doc.paragraphs[0]
run = para.add_run()
fldChar = OxmlElement("w:fldChar")
fldChar.set(qn("w:fldCharType"), "begin")
instrText = OxmlElement("w:instrText")
instrText.set(qn("xml:space"), "preserve")
instrText.text = 'TOC \o "1-3" \h \z \u'
fldChar2 = OxmlElement("w:fldChar")
fldChar2.set(qn("w:fldCharType"), "separate")
fldChar3 = OxmlElement("w:fldChar")
fldChar3.set(qn("w:fldCharType"), "end")
r_elem = run._r
r_elem.append(fldChar); r_elem.append(instrText)
r_elem.append(fldChar2); r_elem.append(fldChar3)
def add_page_numbers(doc):
from docx.oxml.ns import nsmap
section = doc.sections[0]
footer = section.footer
para = footer.paragraphs[0]
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = para.add_run("- ")
fld = OxmlElement("w:fldChar")
fld.set(qn("w:fldCharType"), "begin")
instr = OxmlElement("w:instrText")
instr.text = "PAGE"
fld2 = OxmlElement("w:fldChar")
fld2.set(qn("w:fldCharType"), "end")
run._r.append(fld); run._r.append(instr); run._r.append(fld2)
para.add_run(" -")
doc = Document(f"manual_v3.2.docx")
# 目次ページを先頭に挿入
toc_para = doc.paragraphs[0]._element.getparent().insert(0, OxmlElement("w:p"))
add_toc(doc)
add_page_numbers(doc)
doc.save("manual_v3.2_with_toc.docx")
print("目次・ページ番号追加完了")
目次とページ番号フッターが自動追加されました。WordでPDF変換すると目次のリンクも有効な状態で出力されます。
STEP 3:版番号と更新履歴を自動管理する
マニュアルの版番号を自動インクリメントして、更新履歴を記録します。
更新日・更新者・変更内容を更新履歴テーブルに自動追記してください。
import json, re
from datetime import datetime
VERSION_FILE = "manual_version.json"
def get_next_version():
try:
with open(VERSION_FILE) as f: data = json.load(f)
except: data = {"major": 1, "minor": 0, "history": []}
data["minor"] += 1
if data["minor"] >= 10: data["major"] += 1; data["minor"] = 0
return data
def update_version_history(changes, author="情報システム部"):
data = get_next_version()
version_str = f"{data['major']}.{data['minor']}"
entry = {"version": version_str, "date": datetime.now().strftime("%Y/%m/%d"),
"author": author, "changes": changes}
data["history"].append(entry)
with open(VERSION_FILE,"w") as f: json.dump(data, f, ensure_ascii=False, indent=2)
return version_str, data["history"]
def add_history_table(doc, history):
doc.add_heading("更新履歴", 1)
tbl = doc.add_table(rows=1, cols=4)
tbl.style = "Light Grid Accent 1"
hdrs = ["バージョン","更新日","更新者","変更内容"]
for ci, h in enumerate(hdrs): tbl.rows[0].cells[ci].text = h
for entry in reversed(history[-10:]): # 最新10件
row = tbl.add_row().cells
row[0].text = entry["version"]
row[1].text = entry["date"]
row[2].text = entry["author"]
row[3].text = entry["changes"]
version, history = update_version_history("受注入力画面のUI変更に対応。手順3-4を更新。")
doc = Document("manual_base.docx")
add_history_table(doc, history)
doc.save(f"manual_v{version}.docx")
print(f"v{version} で保存完了")
版番号が自動インクリメントされてv3.3となり、更新履歴テーブルに変更内容が自動追記されました。版管理が完全に自動化されています。
STEP 4:スクリーンショットを自動撮影して挿入する
Playwrightでシステムの操作画面を自動スクリーンショット撮影してマニュアルに挿入します。
マニュアルに自動挿入するスクリプトを作ってください。
from playwright.sync_api import sync_playwright
import os
SCREENS = [
{"url": "/login", "file": "screens/login.png", "selector": ".login-form"},
{"url": "/orders/new", "file": "screens/order_new.png", "selector": ".order-form"},
{"url": "/orders/list", "file": "screens/order_list.png", "selector": ".order-table"},
{"url": "/dashboard", "file": "screens/dashboard.png", "selector": ".dashboard"},
]
BASE_URL = "https://system.example.com"
def capture_screens(screens, username, password):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
ctx = browser.new_context(viewport={"width": 1280, "height": 900})
page = ctx.new_page()
# ログイン
page.goto(f"{BASE_URL}/login")
page.fill("#username", username)
page.fill("#password", password)
page.click("#login-btn")
page.wait_for_load_state("networkidle")
for screen in screens:
page.goto(f"{BASE_URL}{screen['url']}")
page.wait_for_selector(screen["selector"])
os.makedirs(os.path.dirname(screen["file"]), exist_ok=True)
page.screenshot(path=screen["file"], full_page=False)
print(f" 撮影完了: {screen['file']}")
browser.close()
capture_screens(SCREENS, "admin", "password")
print("全スクリーンショット撮影完了")
Playwrightが自動的にシステムにログインして各画面を撮影しました。4枚のスクリーンショットが保存され、マニュアルへの自動挿入が完了しています。
STEP 5:PDF変換して社内ポータルに自動アップロードする
完成したマニュアルをPDFに変換し、SharePointやConfluenceに自動アップロードします。
import subprocess, requests
SHAREPOINT_URL = "https://company.sharepoint.com/sites/it-manual"
UPLOAD_FOLDER = "/Shared Documents/マニュアル/受発注システム/"
def upload_to_sharepoint(local_path, remote_name, token):
with open(local_path, "rb") as f:
file_content = f.read()
headers = {"Authorization": f"Bearer {token}",
"Content-Type": "application/octet-stream"}
url = (f"{SHAREPOINT_URL}/_api/web/GetFolderByServerRelativeUrl"
f"('{UPLOAD_FOLDER}')/Files/Add(url='{remote_name}',overwrite=true)")
res = requests.post(url, headers=headers, data=file_content)
if res.status_code in [200, 201]:
print(f"SharePointアップロード成功: {remote_name}")
else:
print(f"アップロード失敗: {res.status_code}")
# PDF変換
docx_path = f"manual_v{version}.docx"
subprocess.run(["libreoffice","--headless","--convert-to","pdf",docx_path], check=True)
pdf_path = docx_path.replace(".docx",".pdf")
# SharePointにアップロード
sp_token = get_sharepoint_token() # OAuth2トークン取得
upload_to_sharepoint(pdf_path, f"manual_v{version}.pdf", sp_token)
print(f"マニュアル自動更新完了: v{version}")
マニュアルPDFがSharePointの所定フォルダに自動アップロードされました。システム更新のたびに最新マニュアルが自動配布される仕組みが完成しました。
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
見出し・スタイルをWordスタイル機能で統一:python-docxでスタイル名(Heading1・Normal等)を指定してコンテンツを追加することで、目次自動生成・デザイン統一が簡単に実現できます。
- 2
スクリーンショットは高解像度で取得:pyautoguiで取得するスクリーンショットの解像度設定に注意してください。印刷品質のWordには150dpi以上の画像が必要です。Pillowでリサイズ・圧縮処理を組み合わせます。
- 3
変更履歴と版番号を自動管理:ファイル名に「v1.2_YYYYMMDD」形式の版番号・日付を自動付与して保存することで、バージョン管理と配布管理が容易になります。
ビジネスインパクト
この記事のまとめ
- ✅ 手順・操作方法のデータからWord形式のマニュアルを自動生成できる
- ✅ スクリーンショットの自動取得・挿入でマニュアル更新の工数を90%削減できる
- ✅ 目次・スタイル・版番号を自動設定してプロ品質のマニュアルを作れる
- ✅ システム更新のたびに発生するマニュアル改訂作業を大幅に短縮できる
よくある質問(FAQ)
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。