office-remediation について
Microsoft Office 文書のアクセシビリティ上の問題をプログラムで修正するための API リファレンスとコードパターンです。文書のプロパティや構造、検証を扱う開発者向けです。
主な機能
- 01Word 文書の修正パターン
- 02Excel ブックの修正パターン
- 03PowerPoint プレゼンテーションの修正パターン
- 04PowerShell COM オートメーション
- 05OOXML の直接編集と安全ルール
活用シーン
- 01文書のタイトルと言語情報の設定
- 02表の見出し行や説明的なシート名の設定
- 03画像の代替テキスト追加とスライド構造の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ community-access/ accessibility-agents --skill office-remediationインストール後、Claude Code で/office-remediationを入力して読み込まれたか確認します。
詳細
Office のアクセシビリティ修正パターンスキル
Microsoft Office ドキュメントのアクセシビリティ上の問題をプログラムで修正するための API リファレンスとコードパターンです。
python-docx のパターン(Word .docx)
ドキュメントのタイトルを設定する
from docx import Document
doc = Document("input.docx")
doc.core_properties.title = "Descriptive Title"
doc.save("output.docx")
ドキュメントの言語を設定する
from docx import Document
from docx.oxml.ns import qn
from lxml import etree
doc = Document("input.docx")
styles_element = doc.styles.element
rPrDefault = styles_element.find(qn("w:docDefaults/w:rPrDefault/w:rPr"))
if rPrDefault is not None:
lang = rPrDefault.find(qn("w:lang"))
if lang is None:
lang = etree.SubElement(rPrDefault, qn("w:lang"))
lang.set(qn("w:val"), "en-US")
doc.save("output.docx")
表のヘッダー行を設定する
from docx import Document
from docx.oxml.ns import qn
from lxml import etree
doc = Document("input.docx")
for table in doc.tables:
first_row = table.rows[0]._tr
trPr = first_row.get_or_add_trPr()
existing = trPr.find(qn("w:tblHeader"))
if existing is None:
header_elem = etree.SubElement(trPr, qn("w:tblHeader"))
header_elem.set(qn("w:val"), "true")
doc.save("output.docx")
画像に代替テキストを追加する
from docx import Document
from docx.oxml.ns import qn
doc = Document("input.docx")
for rel in doc.part.rels.values():
if "image" in rel.reltype:
# Images are referenced via <wp:docPr> in the document XML
# Alt text is the 'descr' attribute on the docPr element
pass
# Direct XML approach for inline images:
body = doc.element.body
for docPr in body.iter(qn("wp:docPr")):
if not docPr.get("descr"):
docPr.set("descr", "TODO: Add alt text")
doc.save("output.docx")
見出しレベルを修正する
from docx import Document
HEADING_MAP = {
"Heading 3": "Heading 2", # Example: fix skipped level
}
doc = Document("input.docx")
for para in doc.paragraphs:
if para.style.name in HEADING_MAP:
para.style = doc.styles[HEADING_MAP[para.style.name]]
doc.save("output.docx")
openpyxl のパターン(Excel .xlsx)
ブックのタイトルと作成者を設定する
from openpyxl import load_workbook
wb = load_workbook("input.xlsx")
wb.properties.title = "Descriptive Title"
wb.properties.creator = "Author Name"
wb.save("output.xlsx")
印刷タイトル行を設定する(ヘッダーの繰り返し)
from openpyxl import load_workbook
wb = load_workbook("input.xlsx")
for ws in wb.worksheets:
if ws.max_row > 1:
ws.print_title_rows = "1:1" # Repeat row 1 on every printed page
wb.save("output.xlsx")
汎用的なシート名を検出する
GENERIC = {"Sheet", "Sheet1", "Sheet2", "Sheet3", "Tabelle1", "Feuil1"}
from openpyxl import load_workbook
wb = load_workbook("input.xlsx")
for ws in wb.worksheets:
if ws.title in GENERIC:
print(f"Generic sheet name: '{ws.title}' — rename to describe content")
結合セルを検出する
from openpyxl import load_workbook
wb = load_workbook("input.xlsx")
for ws in wb.worksheets:
if ws.merged_cells.ranges:
for merged in ws.merged_cells.ranges:
print(f"Sheet '{ws.title}': merged range {merged}")
python-pptx のパターン(PowerPoint .pptx)
プレゼンテーションのタイトルを設定する
from pptx import Presentation
prs = Presentation("input.pptx")
prs.core_properties.title = "Descriptive Title"
prs.save("output.pptx")
スライドタイトルの欠落を確認する
from pptx import Presentation
prs = Presentation("input.pptx")
for i, slide in enumerate(prs.slides, 1):
title_shape = slide.shapes.title
if title_shape is None:
print(f"Slide {i}: No title placeholder")
elif not title_shape.text.strip():
print(f"Slide {i}: Empty title")
画像に代替テキストを設定する
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
prs = Presentation("input.pptx")
for i, slide in enumerate(prs.slides, 1):
for shape in slide.shapes:
if shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
if not getattr(shape, "_element").get("descr", ""):
# Access via XML for older python-pptx versions
shape._element.set("descr", "TODO: Add alt text")
prs.save("output.pptx")
読み上げ順序を確認する
from pptx import Presentation
from lxml import etree
prs = Presentation("input.pptx")
for i, slide in enumerate(prs.slides, 1):
shapes = [(s.left, s.top, s.name) for s in slide.shapes]
# Visual order (top-to-bottom, left-to-right) vs. XML order
visual = sorted(shapes, key=lambda s: (s[1], s[0]))
xml_order = [s.name for s in slide.shapes]
visual_order = [s[2] for s in visual]
if xml_order != visual_order:
print(f"Slide {i}: Reading order may differ from visual layout")
PowerShell COM オートメーション(Windows + Office)
Word — タイトルを設定する
$word = New-Object -ComObject Word.Application
$word.Visible = $false
$doc = $word.Documents.Open("C:\path\document.docx")
$doc.BuiltinDocumentProperties("Title").Value = "Accessible Title"
$doc.Save()
$doc.Close()
$word.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) | Out-Null
Excel — タイトルとシート名を設定する
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$wb = $excel.Workbooks.Open("C:\path\spreadsheet.xlsx")
$wb.BuiltinDocumentProperties("Title").Value = "Accessible Title"
# Rename sheets (example)
# $wb.Sheets.Item(1).Name = "Revenue Data"
$wb.Save()
$wb.Close()
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
PowerPoint — タイトルを設定する
$ppt = New-Object -ComObject PowerPoint.Application
$prs = $ppt.Presentations.Open("C:\path\presentation.pptx")
$prs.BuiltinDocumentProperties("Title").Value = "Accessible Title"
$prs.Save()
$prs.Close()
$ppt.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($ppt) | Out-Null
OOXML の直接操作(ZIP + XML)
Python または Office が使えない環境では、ドキュメントを ZIP アーカイブとして直接操作できます。
core.xml を展開して編集する(タイトル/言語)
# Extract
mkdir -p extracted
unzip -o document.docx -d extracted
# Edit title in docProps/core.xml
sed -i 's|<dc:title/>|<dc:title>Accessible Title</dc:title>|' extracted/docProps/core.xml
# Repackage
cd extracted && zip -r ../document-fixed.docx . && cd ..
主な OOXML パス
| プロパティ | ファイル | XML 要素 |
|---|---|---|
| タイトル | docProps/core.xml | <dc:title> |
| 作成者 | docProps/core.xml | <dc:creator> |
| 言語 | word/settings.xml | <w:themeFontLang> |
| 見出しスタイル | word/document.xml | <w:pStyle w:val="Heading1"> |
| 代替テキスト | word/document.xml | <wp:docPr descr="..."> |
| 表のヘッダー | word/document.xml | <w:tblHeader/> |
安全上のルール
- 変更前に必ず元のファイルをバックアップしてください
- 上書きはしないでください —
-fixedサフィックスを付けるか、別の出力パスを使用してください - 修正後に検証してください — Microsoft Accessibility Checker の使用または再監査を推奨します
- COM のクリーンアップ — COM オートメーションの後は、必ず
ReleaseComObjectとQuit()を呼び出してください - エンコーディング — OOXML は UTF-8 を使用します。core.xml に BOM がある場合は保持してください
コメント
Markdown 対応