コンテンツにスキップ

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 が sldNum dt hdr ftr sldImg)は、スライドの場所には含めない(フッターは上の ヘッダー・フッター にまとめる)。
  • ノートのプレースホルダーのうち、ヘッダー・フッター・日付・ページ番号・スライド画像は読まない。
  • テキストボックス・図形の文字はスライドの本文にする([図形] にしない)。スライドの文字はほとんどが図形(プレースホルダーを含む)で、分けると本文が空になるため。
  • 非表示スライドの図形・コメントは スライド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 埋め(ファイル名の順 = スライドの表示順)。