今すぐ修復
- ファイルをドロップ
- 修復はローカルで実行
- 結果をダウンロード
Acrobat や Reader が "There was an error opening this document. The file is damaged and could not be repaired,"(このドキュメントを開くときにエラーが発生しました。ファイルが破損しており修復できませんでした)と表示するとき、それは一般的な不満ではありません。Acrobat はすでに自前の静かな復元を試みて失敗しているのです。PDF は末尾から読み取られ、その末尾の構造こそ、失敗した保存や中断したダウンロードが真っ先に破壊するものです。上にファイルをドロップすると、ツールはブラウザ内で PDF の実際のオブジェクト構造を解析し、見つけられたオブジェクトからクロスリファレンステーブルを再構築し、ちゃんと開くファイルを組み立て直します — 文書があなたの端末から外に出ることは決してありません。
PDF は末尾から読み取られる — だからこそこう壊れる
PDF は上から下へ読み進めるストリームではありません。%PDF-1.7 のようなヘッダーで始まり、続いて番号付きオブジェクトの本体(それぞれ N 0 obj … endobj と書かれる)が並び、ページ・フォント・画像・内容を保持します。本体のあとにクロスリファレンステーブル(xref)が来ます。これはすべてのオブジェクトの正確なバイトオフセットの一覧です。そのあと trailer が文書のルートを指し示し、そして何より重要なことに、ファイルは startxref に続くバイトオフセットと %%EOF マーカーで終わります。
ファイルを開くために、リーダーはまず末尾へ移動し、startxref を読んで xref がどこにあるかを知り、そこへジャンプし、オフセットを使ってルートを見つけページを読み込みます。すべては、その trailer が無傷でオフセットが正しいことにかかっています。PDF 1.5 以降では、この地図を圧縮されたクロスリファレンスストリームとして保存し、多数のオブジェクトをオブジェクトストリーム(ObjStm)にまとめて詰め込むこともできます。より効率的ですが、それは末尾にある 1 つの壊れたストリームが、一度に非常に多くのオブジェクトを覆い隠しかねないことを意味します。
インデックスと trailer がまさに末尾にあるため、保存が中断されたり、ダウンロードが切り詰められたり、増分更新(incremental update)が正しく書けなかったりしたときに、真っ先に犠牲になります。だからこそ「破損した」PDF は、ページの内容は完璧なのにそこへ至る地図が壊れている、ということがこれほど多いのです。
なぜ Acrobat 自身の修復があきらめるのか
Acrobat は通常、壊れた xref を静かに再構築します。オフセットの辻褄が合わなければ、ファイルを走査して obj マーカーを探し、何も告げずにテーブルを作り直します。ですから "could not be repaired"(修復できませんでした)は、その予備の仕組みまで失敗したことを意味します — 損傷が、Acrobat の再構築処理が許容できる範囲を超えたのです。よくある原因は次のとおりです。
末尾が切り詰められた。 途中で止まったダウンロードやコピーは、xref、trailer、startxref、%%EOF をまるごと失い、場合によっては最後のオブジェクトまで失います。増分更新の失敗。 PDF は多くの場合、末尾に新しい xref セクションと trailer を追記することで編集されます。その追記が壊れていると、更新の連鎖が誤った場所を指します。クロスリファレンスストリームやオブジェクトストリームの損傷。 地図そのものが圧縮ストリームで、そのストリームが壊れていると、Acrobat はその中に詰め込まれたオブジェクトを見失うことがあります。転送中のバイトの改変 — 改行コードを変えてしまったテキストモード転送や、バイトを反転させた同期 — もまた、何も噛み合わなくなるまでオフセットを狂わせることがあります。
どの場合も、有用な洞察は同じです。あなたのページを構成するオブジェクトは本体の中にたいてい今も残っており、壊れているのはそこへ至るディレクトリのほうなのです。
より踏み込んだ再構築が取り戻すもの — そしてなぜアップロードしないのか
壊れた trailer を当てにする代わりに、ツールはファイル全体を走査して obj の定義を探し、それぞれが実際にどこで始まるかを記録し、その本当の位置からクロスリファレンステーブルを再構築します。続いて文書のルートとページツリーを張り直し、リーダーが再びページをたどれるようにしつつ、その過程でコンテンツストリーム、埋め込みフォント、画像を救い出します。地図が生き残った圧縮クロスリファレンスストリームやオブジェクトストリームの中にあった場合は、それらも読み取ります。末尾が切り詰められていた場合は、切断より前に書き込まれたすべてのオブジェクトを復元し、それらを囲む有効な PDF を組み立てます。これはすべてあなたのブラウザタブの中だけで実行されます — Acrobat も、アドインも、サーバーへの往復もありません。
正直な限界について。そもそも書き込まれなかった内容は復元できません。ですからファイルが切り詰められていた場合、まだ保存されていなかったページは失われています — 得られるのは切断点までのページです。あなたのページが依存する特定のオブジェクトが損傷領域に入り込んでいた場合、そのページは不完全な状態で戻ることがあります。そして 暗号化されパスワードで保護された PDF は、パスワードがなければ再構築できません。復号するまでオブジェクトが読めないからです。修復が保証するのはプライバシーです。契約書、診療記録、明細書、未公開の作品は、ディスクから読み込まれローカルで組み立て直されます。Network タブ(ネットワークタブ)を見張れば、文書のバイトが 1 バイトたりとも端末の外に出ていないことを確認できます。
修復できるものとできないもの
修復できる
- xref / trailer / startxref が損傷または切り詰められた PDF — テーブルは obj 定義を走査して再構築されます
- 中断されたダウンロードやコピーで切り詰められたファイル — 切断より前に書き込まれたすべてのオブジェクトを復元します
- 増分更新の失敗、または壊れたクロスリファレンス/オブジェクトストリームによって壊れた文書
- Acrobat が開いた途端にファイルは破損して修復できないと言うが、ページのオブジェクトは生き残っている PDF
修復できない
- 切り詰めのあとにそもそも書き込まれなかったページやオブジェクト — それらのバイトはあなたのディスク上にありません
- パスワードで暗号化された PDF(パスワードなし)— 復号するまでオブジェクトを読めません
- 0 バイトのファイル、または認識できる PDF オブジェクトを含まないファイル
- 損傷領域に入り込んだ特定のオブジェクトに依存するページ(不完全な状態で戻ることがあります)
修復が失敗した場合、その理由(データの欠落か構造の破損か)をお伝えします。失敗した修復に料金が請求されることはありません。