PowerPoint¶
扱うこと: PowerPoint の旧形式(.ppt 等)の変換、スライド・ノート・図形・コメントごとの読み取りと TSV の場所。扱わないこと: Word・PowerPoint に共通の処理(Word・PowerPoint の共通処理と Office アプリの管理)、Word 固有の処理(Word)。先に読むページ: Word・PowerPoint の共通処理と Office アプリの管理。
Word・PowerPoint で共通の処理(抽出の流れ・起動と終了・ファイルの読み取り)は Word・PowerPoint の共通処理と Office アプリの管理 を参照。
PowerPoint の旧形式(.ppt 等)の変換(PowerPoint の旧形式の変換)、スライド・ノート・図形・コメントごとの読み取り(PowerPoint のテキスト読み取りと TSV の場所)、PowerPoint に固有の注意点(PowerPoint の注意点・既知の問題)を扱う。
flowchart TD
A["extractDocument(共通)"] --> B{"中身が ZIP?"}
B -- はい --> D["readPptxUnits で読む"]
B -- いいえ --> C["extractWithPowerPoint で<br>.pptx に変換"] --> D
D --> E["writeUnits で場所ごとの TSV を出力"]
PowerPoint の旧形式の変換(extractWithPowerPoint)¶
Word・PowerPoint の抽出処理で ZIP ではないと判定したファイル(.ppt、パスワード付き、拡張子と中身が異なるもの)を、PowerPoint で .pptx に変換する。この処理が呼ぶ getApp は、利用者が PowerPoint を開いていれば接続せずに例外にするため、その場合はここに来ず、そのファイルは取り込まず、理由付きの失敗(Postponed)として見せる(Office アプリ(Excel・Word・PowerPoint)の管理「PowerPoint」)。
| 項目 | 仕様 |
|---|---|
| 開く前の確認 | 暗号化の種類(暗号化されたファイルの判定)を判定する。パスワード付き(新形式)・IRM は、PowerPoint を起動せずに失敗にする。「Legacy」(旧形式・判定できないCFB)・「Text」(空・テキスト等)は、先頭が複合ドキュメント形式(D0 CF 11 E0 A1 B1 1A E1、isCompoundFile)でなければ、PowerPoint で開かずに失敗とする(ファイルが壊れているか、PowerPointのファイルではありません(新形式(ZIP)でも旧形式でもない内容です)。)。PowerPoint はテキストなどのファイルもアウトラインとして開いてしまい、文字化けした内容になるため(◎ テストデータの PowerPoint\異常系\壊れたファイル.pptx)。Word はテキスト・HTML・RTF も正しく読めるため、この確認はしない。「形式の分からないバイナリ」(Unknown)は、アプリごとの予備の切り替えが有効なときだけ、この確認をせずに開かせる |
| 開き方 | Presentations.Open("パス::dummy::", ReadOnly=True, Untitled=False, WithWindow=False)。「形式の分からないバイナリ」も含め、拡張子は元のまま変えない(.ppt に付け替えるとアウトラインとして読むため) |
| パスワード付きファイル(新形式) | 暗号化されたファイルの判定で判定し、開かずに失敗にする。旧形式(.ppt)のパスワード付きは今までどおり、ファイル名末尾の ::<パスワード>:: により、ダイアログを出さずに例外 |
| 保存 | SaveAs(converted.pptx, 24 = ppSaveAsOpenXMLPresentation)。保存した .pptx の先頭が ZIP でなければ「一時ファイルを暗号化した」に失敗にする(暗号化されたファイルの判定の testOfficeOutput) |
| アプリの設定 | DisplayAlerts = 1(ppAlertsNone)、AutomationSecurity = 3。PowerPoint はウィンドウを隠せないため、ファイルをウィンドウ無しで開く |
「形式の分からないバイナリ」で PowerPoint が数秒で例外にならない・ダイアログが出るとメンテナが判断した場合は、${officeFallbackEnabled} でこのアプリの予備を無効にする(PowerPoint の注意点・既知の問題)。無効なときは、PowerPoint を起動せずに 暗号化されているか壊れているため取り込めません。 にする。
PowerPoint のテキスト読み取りと TSV の場所(readPptxUnits)¶
.pptx は Word・PowerPoint のテキスト読み取りの共通の読み取り(readXmlLines、DrawingML の名前空間 a:)で読み、次の場所ごとに TSV にする。
| 場所 | 読み取り元 |
|---|---|
スライドNNN |
ppt/presentation.xml の p:sldIdLst の順(= 表示順)に、リレーションシップからスライドの XML を引く。ファイル名の番号(slide3.xml 等)は表示順と一致しないことがあるため使わない |
スライドNNN(非表示) |
非表示スライド(<p:sld show="0">。show="false" も同じ) |
スライドNNN_ノート |
スライドのリレーションシップ(種類 notesSlide)が指すノートの XML |
ヘッダー・フッター |
各スライドのフッターのプレースホルダー(p:ph の type が ftr)。各スライドに同じ内容が並ぶため、全スライド分をまとめて重複する行は除く(Word の ヘッダー・フッター と同じ扱い) |
スライドNNN[図形] |
SmartArt(dgm:relIds の r:dm が指す ppt/diagrams/dataN.xml)とグラフ(c:chart の r:id が指す ppt/charts/chartN.xml のタイトル・軸ラベル・系列名。項目名・数値は読まない)。図形 1 つを 1 行にし、段落はスペースでつなぐ |
スライドNNN[コメント] |
スライドのリレーションシップ(種類が comments で終わるもの)が指すコメント。旧形式(ppt/comments/commentN.xml の p:cm の p:text)と新形式(ppt/comments/modernComment_*.xml の p188:cm の本文と返信)。コメントの後に返信を 1 件ずつ並べる。作成者名は読まない |
- 図形・グループ内の図形・表のテキストを読む。スライド番号・日付・ヘッダー・フッター・スライド画像のプレースホルダー(
p:phのtypeがsldNumdthdrftrsldImg)は、スライドの場所には含めない(フッターは上のヘッダー・フッターにまとめる)。 - ノートのプレースホルダーのうち、ヘッダー・フッター・日付・ページ番号・スライド画像は読まない。
- テキストボックス・図形の文字はスライドの本文にする(
[図形]にしない)。スライドの文字はほとんどが図形(プレースホルダーを含む)で、分けると本文が空になるため。 - 非表示スライドの図形・コメントは
スライドNNN(非表示)[図形]のように、非表示と分かる名前にする。 - スライドマスター・レイアウトのテキストは読まない。
- スライドに埋め込んだ Office のファイル(
p:oleObj、種類がpackage)の中の文字は、そのスライドのスライドNNN[埋め込みN]に入れる。読み方・上限・失敗の扱いは Word の埋め込みの読み取りと同じ。ノートに埋め込んだものは読まない。
TSV の例(配置・命名の規則は インデックスのファイルの形。クロール対象フォルダが C:\data\営業(インデックス名 営業)の場合):
| 元ファイル(クロール対象フォルダからの相対パス) | 場所 | 出力 TSV |
|---|---|---|
提案.pptx |
3 枚目のスライド | work/store/content/営業/提案.pptx/slide_003.tsv |
提案.pptx |
3 枚目(非表示スライド) | work/store/content/営業/提案.pptx/slide_003_hidden.tsv |
提案.pptx |
3 枚目の発表者ノート | work/store/content/営業/提案.pptx/slide_003_notes.tsv |
提案.pptx |
スライドのフッター | work/store/content/営業/提案.pptx/header_footer.tsv |
- スライドの番号は 3 桁以上の 0 埋め(ファイル名の順 = スライドの表示順)。