トップ回答者
Wordの1行あたり文字数設定をdocument.xmlから取得する方法

質問
-
C#を使ってdocxの解析を行なっています。
Word2010の「ページレイアウト」→「ページ設定」→「文字数と行数」タブにて
設定ができる文字数の取得についての質問です。
例えばWordの中で文字数を「40」のように指定します。
この「40」の値をdocument.xmlから取得したいのですが、どのようにすればよいでしょうか。
おそらくdocument.xml内の以下の要素の部分の値を計算するとできると
思われるのですが、その方法を教えていただければ幸いです。
文字数を変更すると「w:charSpace」が変化することまでは分かりました。
<w:sectPr w:rsidR="004364BB" w:rsidRPr="00481463" w:rsidSect="00B93A77">
<w:pgSz w:w="11906" w:code="9" w:h="16838"/><w:pgMar w:gutter="0" w:footer="992" w:header="851" w:left="1701" w:bottom="1701" w:right="1701" w:top="1701"/>
<w:cols w:space="425"/>
<w:docGrid w:charSpace="532" w:linePitch="292" w:type="linesAndChars"/>
</w:sectPr>
※document.xmlを解析する処理のため、Wordオブジェクトは利用していません。
よろしくお願いいたします。
回答
-
Office Open XMLの仕様書(ECMA-376 5th edition Part 1など)
たぶん以下のような手順になると思います。
(document.xml以外にフォントサイズの取得のためにstyle.xmlも参照)
- 標準フォントのスタイルを探す
document.xml#w:document.body.sectPr.rsidSect と style.xml#w:styles内でrsid.valが一致するw:styleを探す。
参照:17.6.5 docGrid (Document Grid), 17.6.18 sectPr (Section Properties) ,17.7.4.15 rsid (Revision Identifier for Style Definition) - 標準フォントのフォントサイズを取得
style.xml#w:style.pPr.sz.valはフォントサイズの2倍の値になっているので半分の値を取得する。
参照:17.3.2.38 sz (Non-Complex Script Font Size)
例:w:style.pPr.sz.valが21ならフォントサイズは10.5pt - 文字送りを計算する
document.xml#w:document.body.sectPr.docGid.charSpaceはフォントサイズに対しての差になっている。
ただし値は4096/pt。charSpaceが無い場合は0とする。
参照17.6.5 docGrid (Document Grid)
例:値が-2048でフォントサイズ10.5ptなら10.5+(-2048/4096)=字送り10pt - 印字領域の幅を取得する
document.xml#w:document.body.sectPr.pgSZ.wが用紙の幅(twips)
document.xml#w:document.body.sectPr.pgMar.left/rightが左右余白の幅(twips)
参照:17.6.5 docGrid (Document Grid)
例:w:pgSz.w=11906 , w:pgMar.left=1701 ,w:pgMar.right=1701 なら領域は11906-1701-1701=8504twips = 425.2pt - 印字領域の幅と文字送りから文字数を計算する
例:425.2ptに対して字送り10ptなら42文字を収められるので文字数は42文字となる。
※1twips= 1/20pt = 1/1440インチ
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月19日 5:29
- 回答としてマーク つばめ太郎 2017年5月19日 7:10
- 標準フォントのスタイルを探す
すべての返信
-
Office Open XMLの仕様書(ECMA-376 5th edition Part 1など)
たぶん以下のような手順になると思います。
(document.xml以外にフォントサイズの取得のためにstyle.xmlも参照)
- 標準フォントのスタイルを探す
document.xml#w:document.body.sectPr.rsidSect と style.xml#w:styles内でrsid.valが一致するw:styleを探す。
参照:17.6.5 docGrid (Document Grid), 17.6.18 sectPr (Section Properties) ,17.7.4.15 rsid (Revision Identifier for Style Definition) - 標準フォントのフォントサイズを取得
style.xml#w:style.pPr.sz.valはフォントサイズの2倍の値になっているので半分の値を取得する。
参照:17.3.2.38 sz (Non-Complex Script Font Size)
例:w:style.pPr.sz.valが21ならフォントサイズは10.5pt - 文字送りを計算する
document.xml#w:document.body.sectPr.docGid.charSpaceはフォントサイズに対しての差になっている。
ただし値は4096/pt。charSpaceが無い場合は0とする。
参照17.6.5 docGrid (Document Grid)
例:値が-2048でフォントサイズ10.5ptなら10.5+(-2048/4096)=字送り10pt - 印字領域の幅を取得する
document.xml#w:document.body.sectPr.pgSZ.wが用紙の幅(twips)
document.xml#w:document.body.sectPr.pgMar.left/rightが左右余白の幅(twips)
参照:17.6.5 docGrid (Document Grid)
例:w:pgSz.w=11906 , w:pgMar.left=1701 ,w:pgMar.right=1701 なら領域は11906-1701-1701=8504twips = 425.2pt - 印字領域の幅と文字送りから文字数を計算する
例:425.2ptに対して字送り10ptなら42文字を収められるので文字数は42文字となる。
※1twips= 1/20pt = 1/1440インチ
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年5月19日 5:29
- 回答としてマーク つばめ太郎 2017年5月19日 7:10
- 標準フォントのスタイルを探す
-
詳しい手順を教えていただきありがとうございました。
1行あたりの文字数を算出できました。
1/2や4096、twipsの関係といったところは教えていただかない限り分かりませんでした。
本当にたすかりました。
-----
1、2の標準フォントを探すところですが、style.xml内に一致するIDが見つかりませんでした。
Wordの設定を色々と変更しながら試してみたのですが、
style.xmlの中のdocDefaults.rPrDefaultに出てくる<w:sz w:val="21">が
標準フォントらしいということが分かりました。
※フォントを10ptにするとこの要素は消えるようです。
このdocDefaultsに<w:sz>がない場合は、<w:style>内に<w:name w:val="Normal" />がある要素内の
<w:sz w:val="21">が標準フォントのようでした。
※実際にXMLの値を変更してdocxにて表示するとフォントが切り替わっていることが確認できました。