2.解説上の注意点とdocxファイルの実体についてと大まかな処理の流れ

まず一旦、解説上の注意点とdocxファイルの実体について(なんでいじれるのか)とこの後の処理の流れを説明します。


最初に解説上の注意点。

カクヨムさんの仕様上、ネストのインデントが半角スペースやタブだと消されてしまうので、解説の時にはわかりやすいように全角スペースでインデントつけます。

ただし、通常、プログラミング言語のインデントを全角スペースにするのはご法度はっとなので(半角スペースはスルーするけど、全角スペースは不審な文字列として検知する関係上)、これ以降のスクリプトは単純にコピペでは使えません。



次にdocxファイルの実体について。

さて、word、excel、powerpointで使用されている画像の生データを取り出そうと調べたことがある方はいらっしゃるでしょうか。

そうすると、必ず、似たような記述のあるページに行きあたるはずです。

「docx、xlsx、pptxは実際はzipファイルである」と。

どういうことかというと、まず、MS Officeは2003以前と2007以降で標準形式が異なります。

2003以前までのOfficeには各拡張子の末尾の「x」はなく、「doc」、「xls」、「ppt」でした。

しかし、2007以降での標準は「docx」、「xlsx」、「pptx」となっています。

これはファイルの実体が変更になったことに起因します。

MS Office 2003以前まではバイナリ型、読み込むPC側に負担がかからない分、ファイルとしていじる人間の入力に対して、その実体への記述の変換にはかなりの差がありました。バイナリ=二進数なので、記述内容の実体は全て二進数として保存されたファイルだったためです。

MS Office 2007以降、Office Open XMLという形式になり二進数から解放された一方で、「docx」、「xlsx」、「pptx」はそれぞれ、一ファイルが複数の「XML」という形式のファイルによって構成された形になりました。

しかし、複数のファイルで構成されるということは、逆説的に「一つのファイルとして扱えない」ということになります。

それを解決するのが、圧縮であり、故にMS Office 2007以降のファイル形式は実体としては実は「zipファイル」であるため、拡張子を「zip」に変更してzipファイルとして解凍することが可能です。

さて、「docx」形式をzipとして解凍した時のフォルダ構成の一例は以下のようになります。

 ファイル名┬_rels─.rels

      ├customXml┬_rels─item1.xml.rels

      │     ├item1.xml

      │     └itemProps1.xml

      ├docProps┬app.xml

      │     └core.xml

      ├word┬_rels┬document.xml.rels

      │   │  └numbering.xml.rels

      │   ├media(挿入画像とかはこのフォルダに入る)

      │   ├theme─theme1.xml

      │   ├webSettings.xml

      │   ├document.xml

      │   ├endnotes.xml

      │   ├fontTable.xml

      │   ├footer1.xml

      │   ├footer2.xml

      │   ├footer3.xml

      │   ├footnotes.xml

      │   ├header1.xml

      │   ├header2.xml

      │   ├header3.xml

      │   ├numbering.xml

      │   ├settings.xml

      │   └styles.xml

      └[Content_Types].xml

で、wordの内容として記述された実体としてはwordフォルダ内にある傍点を振った「document.xml」に記載されています。

そして、「XML形式」というのはこの形式を知らなくても、この形式とほぼ同じものを知っている人はある程度いるものです。

そのほぼ同じものとは、「HTML」です。

「XML形式」は「HTML」と同様に「タグに挟んで記述」したり、「設定をタグに記載する」ことができます。

今回のスクリプトは、そのwordの「XML」のルビの部分の解析結果を元に置換を行うようになっています。

なお参考にしたというかPythonで組んでくれてる方(qiita)→https://qiita.com/msattova/items/18ea5d4420369772a5de

ちなみにこのPythonのツールがMcAfeeさんで弾かれるので、「理屈同じならパワーシェルでもなんとかなるやろ、なんとか……した、かな……?」が今回のスクリプトです。



最後に処理の流れ。

この流れを基準に説明していくので、適宜確認するか覚えといてください(例の如く無茶ぶり)


1.必要情報の初期設定

2.対象ファイルをzipにしてdocument.xmlにアクセスする

3.始点が指定されたルビを置換する

4.傍点表記を繰り返しを利用してルビ化する

5.始点が指定されていないルビを置換する

6.置換結果を元にdocument.xmlを上書きする

7.対象ファイルをdocxに戻す

8.お片付け

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る