Officeドキュメントを自動化計画 #3 PPT「データコンバート処理」

2019年6月29日

テクノロジー プログラミング

OfficeアプリケーションはMicrosoft製品なので、もともとはWindows製品であることは誰でも知っていますが、MacでもOfficeアプリが販売されています。 そして、Mac版Officeを毎日のように使っている僕が、PowerPointを使っている時に、Windows版にあってMac版にない機能があることに気が付きました。 上記のような表機能で、とある外部ツールと連携する際に、この表に名前をつける必要があったのですが、Mac版には名前をつける機能は存在しないようです。 windows版(web版)には、「代替テキスト」という機能があり、表オブジェクトに対してラベリングをすることができるのですが、Mac版にはこの機能が見つけられませんでした・・・(もしかしたらどこかにあるのかもしれませんが、どうしても見つけられません・・・) そんな使い勝手の違うOfficeですが、最近では、Googleスライドを使ったほうがいいというビジネスマンが増えているようですね。 確かにpptxへの書き出しやpdf書き出し、他人とのデータを共有できるしセキュリティもしっかりしているということを考えると、もはやOffice製品を使うメリットは限りなく少なく感じます。 ただし、それでもOffice製品を手放すことができないのは「他の人がOfficeドキュメントを使っているので、その資料を見るため」という意見がこれまで聞いた中で圧倒的に多かったのですが、なんだかOpenOffice革命が失敗した時と同じように感じてしまうのは、まだまだMicrosoft信者が多いという証拠なのでしょうか?

PowerPointの内容置換処理

PowerPointデータに書かれている文字列を置換してみたいと思います。 この時の手順としては以下の通り、
1. pptxファイルをzip解凍 2. データ内容の文字列置換 3. データ一式をzip圧縮
1番と3番は大した作業ではないので、今回は2番の解説をやってみます。 sample.pptx.zip pptxのサンプルデータを解凍すると、以下のリスト群になるのは以前に説明済みです。 ./[Content_Types].xml ./docProps ./docProps/app.xml ./docProps/thumbnail.jpeg ./docProps/core.xml ./_rels ./_rels/.rels ./ppt ./ppt/viewProps.xml ./ppt/slideLayouts ./ppt/slideLayouts/slideLayout9.xml ./ppt/slideLayouts/slideLayout8.xml ./ppt/slideLayouts/_rels ./ppt/slideLayouts/_rels/slideLayout5.xml.rels ./ppt/slideLayouts/_rels/slideLayout4.xml.rels ./ppt/slideLayouts/_rels/slideLayout2.xml.rels ./ppt/slideLayouts/_rels/slideLayout3.xml.rels ./ppt/slideLayouts/_rels/slideLayout8.xml.rels ./ppt/slideLayouts/_rels/slideLayout9.xml.rels ./ppt/slideLayouts/_rels/slideLayout11.xml.rels ./ppt/slideLayouts/_rels/slideLayout10.xml.rels ./ppt/slideLayouts/_rels/slideLayout6.xml.rels ./ppt/slideLayouts/_rels/slideLayout7.xml.rels ./ppt/slideLayouts/_rels/slideLayout1.xml.rels ./ppt/slideLayouts/slideLayout3.xml ./ppt/slideLayouts/slideLayout2.xml ./ppt/slideLayouts/slideLayout1.xml ./ppt/slideLayouts/slideLayout5.xml ./ppt/slideLayouts/slideLayout4.xml ./ppt/slideLayouts/slideLayout6.xml ./ppt/slideLayouts/slideLayout10.xml ./ppt/slideLayouts/slideLayout11.xml ./ppt/slideLayouts/slideLayout7.xml ./ppt/presentation.xml ./ppt/slideMasters ./ppt/slideMasters/slideMaster1.xml ./ppt/slideMasters/_rels ./ppt/slideMasters/_rels/slideMaster1.xml.rels ./ppt/slides ./ppt/slides/slide3.xml ./ppt/slides/slide2.xml ./ppt/slides/slide1.xml ./ppt/slides/_rels ./ppt/slides/_rels/slide2.xml.rels ./ppt/slides/_rels/slide3.xml.rels ./ppt/slides/_rels/slide1.xml.rels ./ppt/theme ./ppt/theme/theme1.xml ./ppt/_rels ./ppt/_rels/presentation.xml.rels ./ppt/presProps.xml ./ppt/tableStyles.xml ./ppt/printerSettings ./ppt/printerSettings/printerSettings1.bin 今回はこのサンプルデータの中に書かれている文字列を入れ替えてみたいと思います。 対象になるファイルは"ppt/slides/**.xml"です。

文字列書き換え

1ページ目にあたる"ppt/slides/slide1.xml"をテキストエディタで開いてみます。 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ctrTitle"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>{Title}</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Subtitle 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="subTitle" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>{</a:t></a:r><a:r><a:rPr lang="en-US" dirty="0" err="1" smtClean="0"/><a:t>SubTitle</a:t></a:r><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>}</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="797912345"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld> 中断にある、以下の文字列を入れ替えるといいようです。 <a:t>{Title}</a:t> # 以下に変換 <a:t>title : サンプルデータ</a:t> このまま、データ群を圧縮してみます。 階層のrootディレクトリに移動して、以下のコマンドを実行。 $ zip -r test.pptx ./* adding: [Content_Types].xml (deflated 87%) adding: _rels/ (stored 0%) adding: _rels/.rels (deflated 66%) adding: docProps/ (stored 0%) adding: docProps/app.xml (deflated 55%) adding: docProps/thumbnail.jpeg (deflated 40%) adding: docProps/core.xml (deflated 50%) adding: ppt/ (stored 0%) adding: ppt/viewProps.xml (deflated 55%) adding: ppt/slideLayouts/ (stored 0%) adding: ppt/slideLayouts/slideLayout9.xml (deflated 76%) adding: ppt/slideLayouts/slideLayout8.xml (deflated 75%) adding: ppt/slideLayouts/_rels/ (stored 0%) adding: ppt/slideLayouts/_rels/slideLayout5.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout4.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout2.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout3.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout8.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout9.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout11.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout10.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout6.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout7.xml.rels (deflated 41%) adding: ppt/slideLayouts/_rels/slideLayout1.xml.rels (deflated 41%) adding: ppt/slideLayouts/slideLayout3.xml (deflated 75%) adding: ppt/slideLayouts/slideLayout2.xml (deflated 70%) adding: ppt/slideLayouts/slideLayout1.xml (deflated 76%) adding: ppt/slideLayouts/slideLayout5.xml (deflated 83%) adding: ppt/slideLayouts/slideLayout4.xml (deflated 78%) adding: ppt/slideLayouts/slideLayout6.xml (deflated 65%) adding: ppt/slideLayouts/slideLayout10.xml (deflated 70%) adding: ppt/slideLayouts/slideLayout11.xml (deflated 70%) adding: ppt/slideLayouts/slideLayout7.xml (deflated 61%) adding: ppt/presentation.xml (deflated 83%) adding: ppt/slideMasters/ (stored 0%) adding: ppt/slideMasters/slideMaster1.xml (deflated 85%) adding: ppt/slideMasters/_rels/ (stored 0%) adding: ppt/slideMasters/_rels/slideMaster1.xml.rels (deflated 86%) adding: ppt/slides/ (stored 0%) adding: ppt/slides/slide3.xml (deflated 60%) adding: ppt/slides/slide2.xml (deflated 60%) adding: ppt/slides/slide1.xml (deflated 61%) adding: ppt/slides/_rels/ (stored 0%) adding: ppt/slides/_rels/slide2.xml.rels (deflated 41%) adding: ppt/slides/_rels/slide3.xml.rels (deflated 41%) adding: ppt/slides/_rels/slide1.xml.rels (deflated 41%) adding: ppt/theme/ (stored 0%) adding: ppt/theme/theme1.xml (deflated 80%) adding: ppt/_rels/ (stored 0%) adding: ppt/_rels/presentation.xml.rels (deflated 79%) adding: ppt/presProps.xml (deflated 50%) adding: ppt/tableStyles.xml (deflated 9%) adding: ppt/printerSettings/ (stored 0%) adding: ppt/printerSettings/printerSettings1.bin (deflated 91%) PowerPointで開いてみます。 見事に文字列が入れ替わってくれています。 文字列入れ替えは非常に簡単ですね。 しかも、2バイト文字でも問題なさそうです。

sub-title箇所は困難

タイトル部分はうまくいきましたが、サブタイトル部分は以下のような構成になっています。 <a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>{</a:t></a:r> <a:r><a:rPr lang="en-US" dirty="0" err="1" smtClean="0"/><a:t>SubTitle</a:t></a:r> <a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>}</a:t></a:r> 改行を入れてわかりやすくしていますが、{...}をタグで分割されています。 デフォルトファイルのまま直接使ったんのでオブジェクトが特殊だったのかもしれませんが、スペル変換など、内部におけるタグ防止だと考えられますが、PowerPoint内部では、こうした変換が行われるという事実が判明しました。 とりあえず、上記タイトルのように、1つのタグにまとめて文字置換してみます。 <a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>サブタイトル表示</a:t></a:r> どうやら問題なく置換されているようですね。 ただ、こうした場合に、自動判別プログラムで、置き換え文字を検索するのが結構大変になりそうで少し不安ですね。

タグ分割解決法

今回タグ分割されてしまう事象があった場合にどう対処すればいいかを調査してみました。 どうやらこれは、「スペルチェック」機能が、error箇所をタグで分割して、表示で赤い下線を引くという仕様になっている機能にあたったようです。 スペルチェック単語と類似で、スペルミスと判断されてしまっていたようです。 これは、任意の置き換え文字を許容した場合に起こり得る事象ですね。 この解決方法は、ツール内にあるスペルチェックを起動させて、赤線が惹かれているワードを許容する操作をして上げる必要があります。 または、アプリの設定画面でスペルチェック機能をoffにしておくといいようです。 もう一つツール側で対応できる要素として、スペルチェック要素を全て除外するという処理を事前に行うと、こうしたユーザー作業負担が無くなるかもしれませんね。 以後のコンバータ精度向上で対応してみたいと思います。 次回はPPTフィアルに、別ファイルのイメージファイルを差し込んでみたいと思います。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。