mcpField
O
office-remediation

office-remediation

github.com/community-accessドキュメント429198 回インストール今日更新
リポジトリ

office-remediation について

Microsoft Office 文書のアクセシビリティ上の問題をプログラムで修正するための API リファレンスとコードパターンです。文書のプロパティや構造、検証を扱う開発者向けです。

主な機能

  1. 01Word 文書の修正パターン
  2. 02Excel ブックの修正パターン
  3. 03PowerPoint プレゼンテーションの修正パターン
  4. 04PowerShell COM オートメーション
  5. 05OOXML の直接編集と安全ルール

活用シーン

  1. 01文書のタイトルと言語情報の設定
  2. 02表の見出し行や説明的なシート名の設定
  3. 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/>

安全上のルール

  1. 変更前に必ず元のファイルをバックアップしてください
  2. 上書きはしないでください — -fixed サフィックスを付けるか、別の出力パスを使用してください
  3. 修正後に検証してください — Microsoft Accessibility Checker の使用または再監査を推奨します
  4. COM のクリーンアップ — COM オートメーションの後は、必ず ReleaseComObject と Quit() を呼び出してください
  5. エンコーディング — OOXML は UTF-8 を使用します。core.xml に BOM がある場合は保持してください

コメント