ByteScope

PowerPoint プレゼン(pptx)ファイル形式

Office Open XML 形式の Microsoft PowerPoint プレゼンテーション。

MIME タイプ
application/vnd.openxmlformats-officedocument.presentationml.presentation
拡張子
.pptx
カテゴリ
ドキュメント

マジックナンバー(ファイル署名)

0x00000000504B0304PK··'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 を展開するのが一番速いのはそのためです。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
04Local file header signature50 4B 03 04。このファイルは ZIP であり、このオフセットでは Word 文書ともブックとも電子書籍とも素のアーカイブとも見分けが付きません。プレゼンらしさはすべてエントリ名の側にあります。
42Version needed to extract必要な読み取り側の最小バージョンを 10 倍した値、リトルエンディアン。deflate なら 20。大きな動画を埋め込んだスライドは、OOXML 一族の中で唯一 4 GiB の壁に本当に当たり、ZIP64 の 45 が必要になることがあります。
62General purpose bit flagビット 3 は CRC とサイズをデータの後ろの data descriptor へ移し、ビット 11 は名前が UTF-8 であることを宣言します。デスクトップからドラッグしたメディアのファイル名は非 ASCII であることが多いので、ビット 11 は文書よりスライドのほうがよく立ちます。
82Compression methodXML パーツは 8。ppt/media/ 以下のメディアは方式 0 でそのまま格納されることがよくあります。すでに圧縮済みの JPEG や MP4 を deflate しても時間を食うだけで何も得られないからです。だから大きなスライドの ZIP は中身の大半が無圧縮のバイト列です。
102Last modified timeMS-DOS のパック形式の時刻で、分解能 2 秒、タイムゾーンなし。PowerPoint はこれを正規化するので、意味のある作成日時はパッケージ内の docProps/core.xml にあります。
122Last modified dateMS-DOS のパック形式の日付で、年は 1980 年起点。それより前は表現できないので、古い取り込みメディアは 1980-01-01 に着地します。
144CRC-32このパーツの非圧縮バイト列だけを対象としたチェックサム。画像 1 枚が壊れていても各スライドの XML は完璧に検証を通るので、壊れた .pptx がテキストは無事で画像 1 枚だけ壊れた状態で開くのはこのためです。
184Compressed sizeこのパーツの格納バイト数。方式 0 で格納されたメディアのエントリでは非圧縮サイズとちょうど一致するので、hex ダンプでどのエントリが生メディアかを手早く見分けられます。
224Uncompressed size元の長さ。アーカイブ全体でこの 2 つのサイズを見比べると、スライドの形が見えてきます。よく縮む XML パーツが少しと、まったく縮まないメディアが長く続く構成です。
262File name lengthOOXML の書き手はどれも [Content_Types].xml を先頭に置くので、そのときは 13 00(19 バイト)。ファイル内で最初に情報を持つフィールドです。
282Extra field lengthPowerPoint 自身が書いたものならゼロ。再パックするツールが Unix のパーミッションやタイムスタンプの extra field をここに足すので、スライドを 1 枚も変えていないのにファイルのハッシュだけが変わります。
3019First entry name[Content_Types].xml。/ppt/presentation.xml に対する Override が presentationml.presentation で終わるコンテンツタイプを持っていて、これがパッケージ自身による「自分は何か」の宣言です。どんな拡張子よりも信頼できます。
variablevariableppt/presentation.xmlこのパッケージをスライドにしているパーツです。固定オフセットにはないのでセントラルディレクトリからたどります。中には表示順にスライド id が並び、それぞれが ppt/_rels/presentation.xml.rels 経由で ppt/slides/slideN.xml に解決されます。だからパーツ名の番号が実際の並び順と一致している必要はありません。
-224End of central directory signature50 4B 05 06。アーカイブコメントが空なら末尾から 22 バイトの位置です。読み手はここからスライドを列挙するので、スライドが開くかどうかはファイルの末尾が生き残っているかにかかっています。
-64Offset 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
ZIP50 4B 03 04.zip
OLE2 / CFBD0 CF 11 E0 A1 B1.doc

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

PowerPoint プレゼン(pptx)かもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。