PowerPoint プレゼン(pptx)ファイル形式
Office Open XML 形式の Microsoft PowerPoint プレゼンテーション。
- MIME タイプ
- application/vnd.openxmlformats-officedocument.presentationml.presentation
- 拡張子
- .pptx
- カテゴリ
- ドキュメント
マジックナンバー(ファイル署名)
| 0x00000000 | 504B0304 | PK·· | 'PK' — it is a ZIP |
ZIP 内に '[Content_Types].xml' と 'ppt/' ディレクトリがあります。
PowerPoint プレゼン(pptx)形式について
.pptx は Open Packaging Conventions のパッケージで、スライド・レイアウト・マスターとそれらが参照するメディアをパーツとして持つ ZIP です。ppt/presentation.xml がスライドの順序を示し、ppt/slides/slideN.xml のそれぞれが 1 枚分の図形とテキストを持ち、画像や動画は ppt/media/ の下に普通のファイルとして置かれます。メディアがマークアップに埋め込まれず、そのまま格納されているので、スライドのファイルサイズはほぼ画像の合計です。プレゼンから画像を全部取り出したいとき、ZIP を展開するのが一番速いのはそのためです。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | Local file header signature | 50 4B 03 04。このファイルは ZIP であり、このオフセットでは Word 文書ともブックとも電子書籍とも素のアーカイブとも見分けが付きません。プレゼンらしさはすべてエントリ名の側にあります。 |
| 4 | 2 | Version needed to extract | 必要な読み取り側の最小バージョンを 10 倍した値、リトルエンディアン。deflate なら 20。大きな動画を埋め込んだスライドは、OOXML 一族の中で唯一 4 GiB の壁に本当に当たり、ZIP64 の 45 が必要になることがあります。 |
| 6 | 2 | General purpose bit flag | ビット 3 は CRC とサイズをデータの後ろの data descriptor へ移し、ビット 11 は名前が UTF-8 であることを宣言します。デスクトップからドラッグしたメディアのファイル名は非 ASCII であることが多いので、ビット 11 は文書よりスライドのほうがよく立ちます。 |
| 8 | 2 | Compression method | XML パーツは 8。ppt/media/ 以下のメディアは方式 0 でそのまま格納されることがよくあります。すでに圧縮済みの JPEG や MP4 を deflate しても時間を食うだけで何も得られないからです。だから大きなスライドの ZIP は中身の大半が無圧縮のバイト列です。 |
| 10 | 2 | Last modified time | MS-DOS のパック形式の時刻で、分解能 2 秒、タイムゾーンなし。PowerPoint はこれを正規化するので、意味のある作成日時はパッケージ内の docProps/core.xml にあります。 |
| 12 | 2 | Last modified date | MS-DOS のパック形式の日付で、年は 1980 年起点。それより前は表現できないので、古い取り込みメディアは 1980-01-01 に着地します。 |
| 14 | 4 | CRC-32 | このパーツの非圧縮バイト列だけを対象としたチェックサム。画像 1 枚が壊れていても各スライドの XML は完璧に検証を通るので、壊れた .pptx がテキストは無事で画像 1 枚だけ壊れた状態で開くのはこのためです。 |
| 18 | 4 | Compressed size | このパーツの格納バイト数。方式 0 で格納されたメディアのエントリでは非圧縮サイズとちょうど一致するので、hex ダンプでどのエントリが生メディアかを手早く見分けられます。 |
| 22 | 4 | Uncompressed size | 元の長さ。アーカイブ全体でこの 2 つのサイズを見比べると、スライドの形が見えてきます。よく縮む XML パーツが少しと、まったく縮まないメディアが長く続く構成です。 |
| 26 | 2 | File name length | OOXML の書き手はどれも [Content_Types].xml を先頭に置くので、そのときは 13 00(19 バイト)。ファイル内で最初に情報を持つフィールドです。 |
| 28 | 2 | Extra field length | PowerPoint 自身が書いたものならゼロ。再パックするツールが Unix のパーミッションやタイムスタンプの extra field をここに足すので、スライドを 1 枚も変えていないのにファイルのハッシュだけが変わります。 |
| 30 | 19 | First entry name | [Content_Types].xml。/ppt/presentation.xml に対する Override が presentationml.presentation で終わるコンテンツタイプを持っていて、これがパッケージ自身による「自分は何か」の宣言です。どんな拡張子よりも信頼できます。 |
| variable | variable | ppt/presentation.xml | このパッケージをスライドにしているパーツです。固定オフセットにはないのでセントラルディレクトリからたどります。中には表示順にスライド id が並び、それぞれが ppt/_rels/presentation.xml.rels 経由で ppt/slides/slideN.xml に解決されます。だからパーツ名の番号が実際の並び順と一致している必要はありません。 |
| -22 | 4 | End of central directory signature | 50 4B 05 06。アーカイブコメントが空なら末尾から 22 バイトの位置です。読み手はここからスライドを列挙するので、スライドが開くかどうかはファイルの末尾が生き残っているかにかかっています。 |
| -6 | 4 | Offset of the central directory | ディレクトリの絶対バイト位置で、条件は同じです。ファイルの前に何かが足されると壊れ、PowerPoint はずれを補正しようとせず、破損したプレゼンテーションだと報告します。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| Word 文書(docx) | 中身が違うだけの同じパッケージ形式で、ローカルファイルヘッダ全体も、オフセット 30 も同一です。決着を付けるのはセントラルディレクトリで、ppt/presentation.xml と ppt/ ツリーか、word/document.xml と word/ ツリーか。[Content_Types].xml も Override のコンテンツタイプで種類を明示しています。 |
| ppt | 前の世代は D0 CF 11 E0 A1 B1 1A E1 で始まる Compound File Binary コンテナで、文字どおり 'PowerPoint Document' という名前のストリームを持ちます。どちらも「PowerPoint のファイル」と呼ばれ、同じアプリで開きますが、内部構造には共通点が一切ありません。新しいほうは XML を詰めた ZIP、古いほうはバイナリレコードでできた小さなファイルシステムです。 |
| ZIP | これは ZIP なので、問うべきは「どの ZIP か」です。判定は肯定形にする必要があります。パッケージのルートに [Content_Types].xml と _rels/.rels があれば OOXML、さらに ppt/ ディレクトリがあればプレゼンです。たまたま ppt という名前のフォルダが入っているだけの素のアーカイブはスライドではありません。必須パーツがどちらも無いからです。 |
| pptm | マクロ有効の兄弟で、ヘッダを見る限りどこも同一です。違いは ppt/vbaProject.bin パーツがあることと、宣言されたコンテンツタイプが違うこと。.pptm を .pptx にリネームしても構造は何も変わらないので、どちらを持っているかはパッケージを開いてみるまで分かりません。 |
よくある壊れ方
- アーカイブの末尾が失われた。スライドは圧縮されたまま無傷でファイル内に残っているのに、PowerPoint は開こうとしません。スライドの列挙が end-of-central-directory レコードから始まるからです。50 4B 03 04 を前方に走査してディレクトリを組み直せば、たいていスライドも画像も全部戻ります。
- 50 4B 03 04 の前にバイトが付いた。エラーページを先に拾ってしまったダウンロードはパッケージ全体をずらすので、セントラルディレクトリの絶対オフセットが本物のヘッダに着地しなくなります。スライドはすべて残っており、先頭のバイトを取り除けば元通りです。
- テキストモード転送。改行変換は deflate ストリームを壊す一方でヘッダのフィールドもエントリ名も読める状態に残すので、パッケージは正しく一覧でき、スライドを展開する段で CRC 不一致になります。方式 0 で格納されたメディアも同じくらい静かに壊れますが、そちらはエラーではなく画像の破損として現れます。
- メディアのエントリが 1 つ壊れている。画像や動画は普通の ZIP エントリなので、1 枚壊れてもスライドの XML はすべて検証を通り、1 枚のスライドで画像なしのプレースホルダが表示されるだけです。現実に一番よくある .pptx の障害であり、影響は完全にそのエントリ内に閉じています。
- レイアウトを崩したまま再パックした。スライドの XML を手で編集して zip し直すのは失敗しやすい作業です。フォルダのディレクトリエントリを含める、名前の大小文字を変える、XML 宣言の前に BOM を入れる。いずれも、あらゆる ZIP ツールが健全と呼び、PowerPoint が破損と呼ぶパッケージを生みます。
この形式の現在地
.pptx は既定のプレゼンテーション形式で、しかも本気で脅かされてはいません。プレゼンは、まともな代替標準が存在しない数少ない文書分野だからです。Keynote も Google スライドも、置き換えようとするのではなく取り込みと書き出しに対応しました。コンテナとしての設計は良好で、公開された ISO 標準であり、メディアが普通のファイルとして入っているので取り出しが簡単、パーツが XML なので壊れたスライドもかなりの部分を救えます。実務上の問題はサイズと再現性に集中しています。メディアを参照ではなく埋め込みで持つため、フル解像度の写真を十数枚と動画を 1 本入れれば数百 MB になり、それがそのままメールで回ります。そして描画がフォント・レイアウト・継承したマスターに依存するため、書体の入っていないマシンで開いたスライドはテキストボックスが軒並みずれます。最後の版を送る前に PDF へ書き出す慣習があるのは、まさにこの問題のためです。作るための編集可能な形式と、渡すための固定レイアウトの形式を使い分けているわけです。他人のプレゼンから素材を抜き出すなら、正体どおり ZIP として扱うほうが、画像を 1 枚ずつ保存するより速く、しかも無劣化です。
PowerPoint プレゼン(pptx)ファイルをこのサイトで開く
どれもブラウザ内で動きます。ファイルが端末から出ることはありません。
関連する形式
PowerPoint プレゼン(pptx)と混同しやすい形式です。先頭バイトを見比べてください。
| 形式 | 先頭バイト | 拡張子 |
|---|---|---|
| Word 文書(docx) | 50 4B 03 04 | .docx |
| Excel ブック(xlsx) | 50 4B 03 04 | .xlsx |
| ZIP | 50 4B 03 04 | .zip |
| OLE2 / CFB | D0 CF 11 E0 A1 B1 | .doc |