<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>DOCX on KnightLiブログ</title>
        <link>https://www.knightli.com/ja/tags/docx/</link>
        <description>Recent content in DOCX on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Sat, 04 Apr 2026 11:00:00 +0800</lastBuildDate><atom:link href="https://www.knightli.com/ja/tags/docx/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Anthropic のエージェント スキル docx の機能、コード構成、使用法、注意事項を分析する</title>
        <link>https://www.knightli.com/ja/2026/04/04/analyze-docx-agent-skill/</link>
        <pubDate>Sat, 04 Apr 2026 11:00:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/ja/2026/04/04/analyze-docx-agent-skill/</guid>
        <description>&lt;p&gt;Anthropic の &lt;code&gt;skills/docx&lt;/code&gt; は本質的に、「AI が Word ドキュメントをより安定して処理できるようにする」作業仕様書とスクリプト ツールのセットです。&lt;br&gt;
これはモデルに単に「&lt;code&gt;.docx&lt;/code&gt; を書く」と指示するのではなく、Word 文書の処理をいくつかの明確なパス (新しい文書の作成、コンテンツの読み取り、既存の文書の編集、改訂の処理、コメントの追加、形式の変換、OOXML 構造の検証) に分割します。&lt;/p&gt;
&lt;p&gt;一文だけ読めば次のように理解できます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;エージェントが &lt;code&gt;.docx&lt;/code&gt; をブラック ボックスとして扱うのではなく、ZIP + XML + Office の互換性の問題として扱うようにします。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;このスキルはどのような問題を解決しますか&#34;&gt;このスキルはどのような問題を解決しますか?
&lt;/h2&gt;&lt;p&gt;通常のテキスト生成モデルが Word 文書を処理する場合、いくつかの一般的な問題が発生します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;テキストを出力するだけであり、実際には構造的に正しい &lt;code&gt;.docx&lt;/code&gt; は生成されません。&lt;/li&gt;
&lt;li&gt;既存のドキュメントを変更する場合、OOXML 構造は簡単に壊れてしまう&lt;/li&gt;
&lt;li&gt;コメント、改訂、コメント スレッドに遭遇したとき、どの XML を変更すればよいのかわかりません。&lt;/li&gt;
&lt;li&gt;ドキュメントを生成できますが、Word、LibreOffice、Google Docs 間の互換性が不安定です&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pandoc&lt;/code&gt; をいつ使用するか、いつ解凍して XML を直接変更するかがわからない&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここに、&lt;code&gt;docx&lt;/code&gt; スキルの価値があります。 「何をするか」を事前に制約します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテンツを読み取るときは、&lt;code&gt;pandoc&lt;/code&gt; の使用または解凍を優先してください。&lt;/li&gt;
&lt;li&gt;新しく &lt;code&gt;.docx&lt;/code&gt; を作成する場合は、&lt;code&gt;docx-js&lt;/code&gt; を優先してください。&lt;/li&gt;
&lt;li&gt;既存の &lt;code&gt;.docx&lt;/code&gt; を編集する場合は、まず「解凍 -&amp;gt; XML の変更 -&amp;gt; 再パッケージ化 -&amp;gt; 検証」に進みます。&lt;/li&gt;
&lt;li&gt;モデルをハードコーディングするのではなく、コンパニオン スクリプトを使用して、リビジョン、コメント、スキーマ検証の受け入れの詳細を処理します。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Word 文書の問題は、多くの場合、「テキストが正しく記述されているかどうか」ではなく、「ファイル構造が Office で受け入れられるかどうか」であるため、この考え方は非常に実用的です。&lt;/p&gt;
&lt;h2 id=&#34;ディレクトリとコードの構成&#34;&gt;ディレクトリとコードの構成
&lt;/h2&gt;&lt;p&gt;このスキルは大きく4つのレベルに分かれています。&lt;/p&gt;
&lt;h3 id=&#34;1-説明レイヤー-skillmd&#34;&gt;1. 説明レイヤー: &lt;code&gt;SKILL.md&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; はスキル全体への入り口です。主に次の 2 つのことを行います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;トリガー条件を定義する&lt;br&gt;
このスキルは、ユーザーが Word、&lt;code&gt;.docx&lt;/code&gt;、コメント、改訂、目次、ページ番号、テンプレート、書式設定されたドキュメントなどを必要とする限り有効にする必要があります。&lt;/li&gt;
&lt;li&gt;作業パスを指定する&lt;br&gt;
毎回即興で作るのではなく、さまざまなタスクに対してどの技術的なルートを取るべきかを明確に書き出します。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;内容から判断すると、「使用説明書」と「動作仕様書」の両方です。&lt;br&gt;
特に価値があるのは、そこにリストされている次のような多くの Word 互換性ルールです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docx-js&lt;/code&gt; のデフォルトは US レターではなく A4 です&lt;/li&gt;
&lt;li&gt;ページが水平の場合、内部ロジックに従って幅と高さのパラメータを渡す必要があります。&lt;/li&gt;
&lt;li&gt;リストは手動で挿入できません Unicode 箇条書き&lt;/li&gt;
&lt;li&gt;表の幅は表とセルと同時に設定する必要があります。&lt;/li&gt;
&lt;li&gt;画像を挿入する場合、&lt;code&gt;type&lt;/code&gt;は省略できません。&lt;/li&gt;
&lt;li&gt;生成後、&lt;code&gt;validate&lt;/code&gt;を実行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは、作者が単に「生成できること」ではなく、「安定して開くことができ、安定してレンダリングでき、生成後に互換性があること」を望んでいることを示しています。&lt;/p&gt;
&lt;h2 id=&#34;2-office-パッケージ操作層-scriptsoffice&#34;&gt;2. Office パッケージ操作層: &lt;code&gt;scripts/office/*&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;この層は、&lt;code&gt;.docx/.pptx/.xlsx&lt;/code&gt; を Office Open XML パッケージとして処理する役割を果たします。&lt;/p&gt;
&lt;h3 id=&#34;unpackpy&#34;&gt;&lt;code&gt;unpack.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;その機能は、Office ファイルをディレクトリに解凍し、いくつかの補助タスクを実行することです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ZIPパッケージを解凍します&lt;/li&gt;
&lt;li&gt;XML/&lt;code&gt;.rels&lt;/code&gt; できれいに印刷します&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.docx&lt;/code&gt; に対する &lt;code&gt;merge_runs&lt;/code&gt; のオプションの実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.docx&lt;/code&gt; に対する &lt;code&gt;simplify_redlines&lt;/code&gt; のオプションの実行&lt;/li&gt;
&lt;li&gt;スマート クオートを XML エンティティに変換して、後続の処理リスクを軽減します&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その設計の焦点は、「単純な解凍」ではなく、エージェントや人間が編集を続けるのに適した状態にファイルを整理することにあります。&lt;/p&gt;
&lt;h3 id=&#34;packpy&#34;&gt;&lt;code&gt;pack.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;この機能は、変更されたディレクトリを &lt;code&gt;.docx/.pptx/.xlsx&lt;/code&gt; に再パッケージ化することです。&lt;br&gt;
梱包する前に行うべき重要なことが 2 つあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オプションの動作検証と自動修復&lt;/li&gt;
&lt;li&gt;XML を再圧縮し、無意味な空白やコメントを削除します。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;--original&lt;/code&gt; が指定されている場合は、バリデーターと比較されます。これは非常に重要です。&lt;br&gt;
Word の変更の多くは「元に戻すことができれば成功する」わけではなく、文書の構造とリビジョンの追跡セマンティクスがまだ有効であることを確認する必要があるためです。&lt;/p&gt;
&lt;h3 id=&#34;validatepy&#34;&gt;&lt;code&gt;validate.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;これはスキル全体の品質ゲートです。&lt;br&gt;
検証をサポートします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XML は整形式ですか?&lt;/li&gt;
&lt;li&gt;名前空間は正しいですか?&lt;/li&gt;
&lt;li&gt;すべての種類の ID は一意ですか?&lt;/li&gt;
&lt;li&gt;関係性/コンテンツタイプは一致していますか?&lt;/li&gt;
&lt;li&gt;XSDスキーマに準拠&lt;/li&gt;
&lt;li&gt;空白の保持ルールは正しいですか?&lt;/li&gt;
&lt;li&gt;挿入、削除、コメントマークは合法ですか?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;.docx&lt;/code&gt; の場合、このステップはほぼコア コンピテンシーです。&lt;br&gt;
「XML が少しだけ変更されているだけ」のように見える多くの文書の場合、本当の問題はここにあります。&lt;/p&gt;
&lt;h3 id=&#34;sofficepy&#34;&gt;&lt;code&gt;soffice.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;これは非常にエンジニアリング的なガジェットです。&lt;br&gt;
単に LibreOffice を呼び出すのではなく、制限された環境向けの互換性処理を準備し、自動的に &lt;code&gt;SAL_USE_VCLPLUGIN=svp&lt;/code&gt; を設定し、制限された AF_UNIX ソケットの問題を解決するために必要に応じて shim を構築します。&lt;/p&gt;
&lt;p&gt;これは、スキルの対象環境が「ローカルデスクトップの手動操作」だけではなく、エージェントやCI、サンドボックスなどの自動化された環境も考慮していることがわかります。&lt;/p&gt;
&lt;h2 id=&#34;3-wordの特殊能力レベルコメント修正朱書き&#34;&gt;3. Wordの特殊能力レベル：コメント、修正、朱書き
&lt;/h2&gt;&lt;h3 id=&#34;commentpy&#34;&gt;&lt;code&gt;comment.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;このスクリプトは、DOCX にコメントを追加する役割を果たします。&lt;br&gt;
Word のコメントは単一のファイル メカニズムではなく、連携して動作する一連のコンポーネントであるため、その動作は「コメント XML を書く」よりもはるかに複雑です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;word/comments.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtended.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsIds.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtensible.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;document.xml&lt;/code&gt; のコメント範囲マーカー&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Content_Types].xml&lt;/code&gt; および &lt;code&gt;document.xml.rels&lt;/code&gt; での関係宣言&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スクリプトでは、これらの依存関係がすでに考慮されています。&lt;br&gt;
初めてコメントを追加する場合、テンプレート ファイル、リレーションシップ、コンテンツ タイプが自動的に完成するため、OOXML を手動で変更する際のエラー率を大幅に減らすことができます。&lt;/p&gt;
&lt;h3 id=&#34;accept_changespy&#34;&gt;&lt;code&gt;accept_changes.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;このスクリプトの目標は非常に明確です。すべてのリビジョンを受け入れることです。&lt;br&gt;
実装方法はXMLを自分で修正するのではなく、LibreOfficeのヘッドレス+Basicマクロで&lt;code&gt;.uno:AcceptAllTrackedChanges&lt;/code&gt;を調整する方法です。&lt;/p&gt;
&lt;p&gt;Word セマンティクスにおける「リビジョンの受け入れ」は、&lt;code&gt;&amp;lt;w:ins&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;w:del&amp;gt;&lt;/code&gt; を削除するほど単純ではないため、この選択は非常に安全です。 XML を直接変更すると、重大な問題が残る可能性があります。&lt;br&gt;
通常、これを Office エンジン自体で行うと、互換性が向上します。&lt;/p&gt;
&lt;h3 id=&#34;validatorsredliningpy&#34;&gt;&lt;code&gt;validators/redlining.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;これがこのスキルの最も注目すべき部分です。&lt;br&gt;
元の文書と変更された文書から「作成者の改訂」を分離し、テキストが一貫しているかどうかを比較して、改訂が追跡された変更構造に正しくラップされているかどうかを判断します。&lt;/p&gt;
&lt;p&gt;言い換えれば、XML 形式をチェックするだけではなく、「リビジョン セマンティクスに従ってドキュメントを編集したか?」をチェックします。&lt;/p&gt;
&lt;p&gt;AI は次のような間違いを犯しやすいため、これはエージェントにとって特に重要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テキストを直接修正します。ただし、&lt;code&gt;&amp;lt;w:ins&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;w:del&amp;gt;&lt;/code&gt; は含めません。&lt;/li&gt;
&lt;li&gt;他の人の挿入または削除構造の階層を変更する&lt;/li&gt;
&lt;li&gt;最終的なテキストは変更されましたが、朱書きのロジックは保持されません&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このバリデータは、この「表面の可用性とセマンティック エラー」の問題を防ぐためのものです。&lt;/p&gt;
&lt;h2 id=&#34;4-スキーマと補助層-schemashelperstemplates&#34;&gt;4. スキーマと補助層: &lt;code&gt;schemas/&lt;/code&gt;、&lt;code&gt;helpers/&lt;/code&gt;、&lt;code&gt;templates/&lt;/code&gt;
&lt;/h2&gt;&lt;h3 id=&#34;schemas&#34;&gt;&lt;code&gt;schemas/&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;ここに、OOXML / ECMA / Microsoft 拡張機能関連の XSD の完全なセットを示します。&lt;br&gt;
これは、スキルの検証が頭でルールを記述することではなく、可能な限り形式的なスキーマ制約に基づいて行われることを意味します。&lt;/p&gt;
&lt;h3 id=&#34;helpers&#34;&gt;&lt;code&gt;helpers/&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;主なものは次のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;merge_runs.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simplify_redlines.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その機能は、解凍された Word XML を適度にクリーンアップして、構造をより安定させ、編集と比較を容易にすることです。&lt;/p&gt;
&lt;h3 id=&#34;templates&#34;&gt;&lt;code&gt;templates/&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;コメント関数が依存する次のような XML テンプレートがここに保存されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;comments.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtended.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsIds.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtensible.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;people.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このタイプのテンプレート ファイルは重要です。多くの Word パーツは「不足している場合に自動的に埋められる」わけではなく、Office で受け入れられる形式で事前に設定されている必要があるからです。&lt;/p&gt;
&lt;h2 id=&#34;一般的な使用法&#34;&gt;一般的な使用法
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; による提案から判断すると、このスキルは次のワークフローに最適です。&lt;/p&gt;
&lt;h2 id=&#34;シナリオ-1-既存の-docx-の読み取りまたは分析&#34;&gt;シナリオ 1: 既存の DOCX の読み取りまたは分析
&lt;/h2&gt;&lt;p&gt;コンテンツを抽出し、構造を読み取り、Markdown に変換することが目的の場合は、以下を使用します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pandoc --track-changes&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;all document.docx -o output.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;基礎となる XML を表示したい場合は、以下を使用します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/unpack.py document.docx unpacked/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;前者は内容を読むのに適しており、後者は構造を見るのに適しています。&lt;/p&gt;
&lt;h2 id=&#34;シナリオ-2-新しい-docx-を作成する&#34;&gt;シナリオ 2: 新しい DOCX を作成する
&lt;/h2&gt;&lt;p&gt;スキルの提案は、OOXML を手動でロールするのではなく、&lt;code&gt;docx-js&lt;/code&gt; を使用して以下を生成することです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;次に、ドキュメントを生成して検証します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/validate.py doc.docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;このルートは次のような場合に適しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;報告&lt;/li&gt;
&lt;li&gt;memo&lt;/li&gt;
&lt;li&gt;letter&lt;/li&gt;
&lt;li&gt;タイトル、目次、フッター、ページネーション、表を含む正式な文書&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;シナリオ-3-既存の-docx-を編集する&#34;&gt;シナリオ 3: 既存の DOCX を編集する
&lt;/h2&gt;&lt;p&gt;これはスキル全体の中核となるワークフローです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/unpack.py document.docx unpacked/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 修改 unpacked/ 下的 XML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/pack.py unpacked/ output.docx --original document.docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ここで重要なのは「XML の変更」ではなく、最後のステップ &lt;code&gt;--original&lt;/code&gt; です。&lt;br&gt;
これにより、システムはパッケージを返すときに、やみくもにパッケージ化するのではなく、スキーマとレッドライン レベルの検証を実行できるようになります。&lt;/p&gt;
&lt;h2 id=&#34;シナリオ-4-すべてのリビジョンを受け入れる&#34;&gt;シナリオ 4: すべてのリビジョンを受け入れる
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/accept_changes.py input.docx output.docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;このステップは LibreOffice に依存します。&lt;br&gt;
レビューされた文書を「クリーンなバージョン」に整理するのに適しています。&lt;/p&gt;
&lt;h2 id=&#34;シナリオ-5-コメントを追加する&#34;&gt;シナリオ 5: コメントを追加する
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python comment.py unpacked/ &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Comment text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python comment.py unpacked/ &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Reply text&amp;#34;&lt;/span&gt; --parent &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ここでは特別な注意を払う必要があります。スクリプトはコメントの内容と必要なコメント コンポーネントのみを追加します。実際、コメントを対応するテキスト範囲に実際に添付するには、コメントの指示に従ってコメント範囲マーカーを &lt;code&gt;document.xml&lt;/code&gt; に追加する必要があります。&lt;/p&gt;
&lt;h2 id=&#34;このスキルの最も注意すべき落とし穴&#34;&gt;このスキルの最も注意すべき落とし穴
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; をざっと見ただけでは、その「互換性ルール」の価値を過小評価するのは簡単です。&lt;br&gt;
特に以下の点は覚えておいてください。&lt;/p&gt;
&lt;h3 id=&#34;1-docx-はテキスト-ファイルではなくoffice-パッケージです&#34;&gt;1. &lt;code&gt;.docx&lt;/code&gt; はテキスト ファイルではなく、Office パッケージです
&lt;/h3&gt;&lt;p&gt;最も危険な誤解は、これを「フォーマットされたテキスト ファイル」として扱うことです。&lt;br&gt;
実際、変更には以下も含まれる場合があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テキスト XML&lt;/li&gt;
&lt;li&gt;relationships&lt;/li&gt;
&lt;li&gt;content types&lt;/li&gt;
&lt;li&gt;comments / people / ids&lt;/li&gt;
&lt;li&gt;スキーマ制約&lt;/li&gt;
&lt;li&gt;リビジョンセマンティクス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、このスキルでは「パッケージの開梱、編集、確認、返却」に重点が置かれています。&lt;/p&gt;
&lt;h3 id=&#34;2-docx-js-はドキュメントを生成できますがデフォルトのパラメーターが目的を満たしているという保証はありません&#34;&gt;2. &lt;code&gt;docx-js&lt;/code&gt; はドキュメントを生成できますが、デフォルトのパラメーターが目的を満たしているという保証はありません。
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; は、次のような多くのデフォルト値の落とし穴を強調表示します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトの用紙はA4です&lt;/li&gt;
&lt;li&gt;水平方向のページ幅と高さの処理には内部ロジックがあります&lt;/li&gt;
&lt;li&gt;リストに箇条書き文字を直接挿入することはできません&lt;/li&gt;
&lt;li&gt;テーブル幅を二重に宣言する必要があります&lt;/li&gt;
&lt;li&gt;Google ドキュメントはパーセント幅との互換性が低い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは、生成ツールが出発点にすぎず、最終的な品質を保証するものではないことを示しています。&lt;/p&gt;
&lt;h3 id=&#34;3-コメントと修正は単一点の修正ではありません&#34;&gt;3. コメントと修正は単一点の修正ではありません
&lt;/h3&gt;&lt;p&gt;コメントであっても、変更の追跡であっても、XML を変更するだけの問題ではありません。&lt;br&gt;
複数のコンポーネント間で一貫性を維持する必要があるため、スキルはこれらのアクションをスクリプト化します。&lt;/p&gt;
&lt;h3 id=&#34;4オープンできるは修正されるという意味ではない&#34;&gt;4.「オープンできる」は「修正される」という意味ではない
&lt;/h3&gt;&lt;p&gt;文書を Word で開くことができるからといって、その構造が正しいとは限りません。&lt;br&gt;
多くのエラーは、次のシナリオでのみ公開されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;再度編集するとクラッシュする&lt;/li&gt;
&lt;li&gt;レビューモード例外&lt;/li&gt;
&lt;li&gt;注釈がありません&lt;/li&gt;
&lt;li&gt;Google ドキュメントを開いた後にレイアウトが崩れる&lt;/li&gt;
&lt;li&gt;リビジョンを再度受け入れるときにエラーが発生する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;したがって、&lt;code&gt;validate.py&lt;/code&gt; と &lt;code&gt;pack.py --original&lt;/code&gt; は非常に重要です。&lt;/p&gt;
&lt;h3 id=&#34;5-外部ツールを利用する場合は事前に環境を準備する&#34;&gt;5. 外部ツールを利用する場合は事前に環境を準備する
&lt;/h3&gt;&lt;p&gt;このスキルは、いくつかの種類の外部ツールに依存しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pandoc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LibreOffice / soffice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docx-js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Python の依存関係 (&lt;code&gt;defusedxml&lt;/code&gt;、&lt;code&gt;lxml&lt;/code&gt; など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのツールが環境にない場合、エージェントがプロセスを知っていても、それを完全に実行することはできません。&lt;/p&gt;
&lt;h2 id=&#34;このスキルは何に向いていて何が不向きなのでしょうか&#34;&gt;このスキルは何に向いていて、何が不向きなのでしょうか？
&lt;/h2&gt;&lt;h3 id=&#34;適切な&#34;&gt;適切な
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Word レポートをバッチ生成する&lt;/li&gt;
&lt;li&gt;構造化された正式文書の生成&lt;/li&gt;
&lt;li&gt;自動変更 &lt;code&gt;.docx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;追跡された変更を保存または処理する&lt;/li&gt;
&lt;li&gt;コメントを自動的に追加する&lt;/li&gt;
&lt;li&gt;Word ドキュメントをスクリプトまたはエージェント ワークフローに組み込む&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;あまり適していない&#34;&gt;あまり適していない
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;PDF をエクスポートするだけの簡単なシナリオ&lt;/li&gt;
&lt;li&gt;プレーン テキスト コンテンツのみが必要で、Word 形式は気にしません&lt;/li&gt;
&lt;li&gt;手動によるビジュアル編集に完全に依存している&lt;/li&gt;
&lt;li&gt;依存関係や環境の準備を一切せずに、すべての Word 自動化を完了したいと考えています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;要約する&#34;&gt;要約する
&lt;/h2&gt;&lt;p&gt;Anthropic の &lt;code&gt;skills/docx&lt;/code&gt; の強みは、「Word を生成する」ことではなく、「Word が問題を起こしやすい理由を知り、問題を事前に分解する」ことにあります。&lt;br&gt;
これは、ドキュメント生成、基礎となる XML 編集、リビジョン セマンティクス、スキーマ検証、および Office 互換性に関する元々散在していた知識を実行可能なワークフローに編成します。&lt;/p&gt;
&lt;p&gt;単純なドキュメントを時々エクスポートするだけの場合は、少し重く感じるかもしれません。&lt;br&gt;
ただし、シナリオに既存の &lt;code&gt;.docx&lt;/code&gt; の変更、コメント、リビジョン、自動バッチ処理、または互換性要件が含まれる限り、この一連のスキルは貴重です。AI が無視する可能性が最も高く、Office ドキュメントが覆される可能性が最も高い詳細を正確に埋めるためです。&lt;/p&gt;
&lt;p&gt;簡単な要約は次のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;SKILL.md&lt;/code&gt; はエージェントにどちらの方向を取るかを伝える責任があります&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/office/*&lt;/code&gt; は開梱、返品、チェック、Office の互換性を担当します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;comment.py&lt;/code&gt; と &lt;code&gt;accept_changes.py&lt;/code&gt; は Word の特殊能力を担当します&lt;/li&gt;
&lt;li&gt;&lt;code&gt;schemas/&lt;/code&gt; とバリデーターは、「機能しているようだ」を「構造的に信頼できる」に改善する責任があります。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;コードアドレス：&lt;a class=&#34;link&#34; href=&#34;https://github.com/anthropics/skills/tree/main/skills/docx&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anthropics/skills/tree/main/skills/docx&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Microsoft Office Word文書docxを圧縮する</title>
        <link>https://www.knightli.com/ja/2025/04/14/compress-docx/</link>
        <pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://www.knightli.com/ja/2025/04/14/compress-docx/</guid>
        <description>&lt;h2 id=&#34;docxドキュメントの構造&#34;&gt;docxドキュメントの構造
&lt;/h2&gt;&lt;p&gt;docx ファイルは基本的に圧縮パッケージであり、Content_Types.xml で定義されたコンテンツ タイプ、.rels ファイルで維持される関係、document.xml のドキュメント コンテンツ、styles.xml のスタイル定義、numbering.xml のリスト スタイルが含まれます。これらのコンポーネントは連携して、ドキュメントの構造とスタイルを構築して表示します。
ファイル名の拡張子 docx を zip に変更すると、次のディレクトリ構造に解凍できます。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  [Content_Types].xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─docProps
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│      app.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│      core.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│      custom.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─word
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  document.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  endnotes.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  fontTable.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  footer1.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  footnotes.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  settings.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  styles.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │  webSettings.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  ├─media
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image1.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image10.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image11.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image12.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image13.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image14.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image15.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image16.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image17.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image2.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image3.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image4.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image5.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image6.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image7.emf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image8.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      image9.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  ├─theme
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │      theme1.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  └─_rels
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│          document.xml.rels
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─_rels
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        .rels
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;docx-ファイルを圧縮する&#34;&gt;docx ファイルを圧縮する
&lt;/h2&gt;&lt;p&gt;多くのスペースを占めるファイルは通常、word/media ディレクトリ内のファイルであり、圧縮は主にこれらのファイルを対象としています。
Docx は現在、JPEG XL、AVIF、WebP 2 などの最新の画像圧縮形式をサポートしていないため、一般的な jpg、png、およびその他の一般的な形式を使用する必要があります。&lt;/p&gt;
&lt;h3 id=&#34;1解凍する&#34;&gt;1.解凍する
&lt;/h3&gt;&lt;p&gt;拡張子を zip に変更して解凍します&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def unzip(file):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    docname = file[0:-5]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if os.path.exists(docname) :
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print(&amp;#39;os.path.exists! remove!&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        shutil.rmtree(docname)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    with pyzipper.PyZipFile(file, &amp;#34;r&amp;#34;) as zf:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        zf.extractall(docname)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-jpgpngその他のファイルを圧縮する&#34;&gt;2. jpg、png、その他のファイルを圧縮する
&lt;/h3&gt;&lt;p&gt;直接圧縮するだけです。圧縮にセシウムを使用すると、より優れた圧縮効果が得られます。コマンドラインツールを使用します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def compress_image(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    input_path: str,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    quality: int = 80
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    command = &amp;#39;caesiumclt.exe --same-folder-as-input --quality &amp;#39; + str(quality) + &amp;#39; &amp;#39; + input_path
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    print(command)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    try:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        os.system(command)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    except Exception as e:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        logging.error(f&amp;#34;An error occurred: {str(e)}&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通常、品質を重視して 50 を選択します。圧縮された画像でも見栄えは良くなります。良い結果を得るために 20 を選択することもできます。
より高い品質 80 を選択した場合でも、圧縮ファイルははるかに小さくなります。&lt;/p&gt;
&lt;h3 id=&#34;3emfファイルを圧縮する&#34;&gt;3.emfファイルを圧縮する
&lt;/h3&gt;&lt;p&gt;emf は通常比較的大きく、jpg png に変換すると通常はさらに小さくなります。 imagemagick を使用して形式を変換し、圧縮することができます。
ファイル名の拡張子が emf から jpg png に変更されるため、word_rels\document.xml.rels ファイルを変更する必要があります。&lt;/p&gt;
&lt;h3 id=&#34;4-梱包&#34;&gt;4. 梱包
&lt;/h3&gt;&lt;p&gt;変更したファイルをそのままパッケージ化し、圧縮方法として ZIP_DEFLATED を選択するだけです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def zip(folder, zipfile):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    print(&amp;#39;zip:&amp;#39;, folder, &amp;#39; -&amp;gt; &amp;#39;, zipfile)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    with pyzipper.PyZipFile(zipfile, &amp;#34;w&amp;#34;,compression=pyzipper.ZIP_DEFLATED) as zf:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        for root,dirs,files in os.walk(folder):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            for file in files:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                abs_path = os.path.join(root,file)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                rel_path = os.path.relpath(abs_path,folder)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                # print(abs_path, rel_path)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                zf.write(abs_path, rel_path)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    shutil.rmtree(folder)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;5-プロセスコード全体&#34;&gt;5. プロセスコード全体
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def compress_docx(indir, outdir):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    for root,dirs,files in os.walk(indir):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        #    print(root,dirs,files) 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        for file in files:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            if file.endswith(&amp;#39;.docx&amp;#39;):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                docfile = os.path.join(root, file)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                unzip(docfile)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                docname = file[0:-5]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                imgpath = os.path.join(root, docname, &amp;#39;word/media/&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                # print(&amp;#39;imgpath=&amp;#39;, imgpath)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                compress_image(imgpath, 50)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                outfolder =  os.path.join(outdir, os.path.relpath(root, indir))
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                if not os.path.exists(outfolder):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    os.mkdir(outfolder)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                zip(os.path.join(root, docname), os.path.join(outfolder, file))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;要約する&#34;&gt;要約する
&lt;/h2&gt;&lt;p&gt;上記の方法、品質 = 50 によれば、docx ファイルは通常、元のサイズの約 1/3 になります。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
