PDF修復診断と復旧計画の作成
破損したPDFを解析すると、多数のエラーメッセージが表示されても、実際に修復できる箇所までは分からないことがあります。この診断は、構造上の検出事項を実用的な報告書にまとめます。相互参照表の欠落、終了していないストリーム、不正な長さ、ファイルの切断などをご入力ください。各項目に一貫した分類、リスク、推奨対応、復旧計画内の順序を付けます。元ファイルを変更する前に、自動修復を試すべきか判断するためにご利用いただけます。
無料で実行
検証メッセージを修復判断に変換します
PDF検証ツールは壊れた構造の名称を示しますが、その出力だけで十分な判断ができるとは限りません。相互参照表の欠落はオブジェクト参照の問題ですが、予期しないファイル終端は必要なバイトが永久に失われた可能性を示します。両者を同じように扱うと、時間を浪費したり、専門家が復元できた証拠を損なったりするおそれがあります。本診断では、入力された各説明を正規化し、明示的に定義した構造障害の種類と照合します。範囲の明確な再構築手法がある場合に限り、既知の問題を修復可能と判定します。また、リスクレベルを付け、推奨する対応を説明します。未知の説明は自動報告では意図的に修復不可とします。オブジェクト境界や参照の信頼性が低下している状況で、根拠なく推測することは危険だからです。検証ツールがオブジェクト番号、バイト位置、ページ、トレーラー位置を示す場合は、その情報もご入力ください。報告書に引き継がれるため、別のログを探さずに各推奨事項を元の検出事項へ対応付けられます。
修復可能という判定の意味をご確認ください
修復可能とは、ファイル内の別の場所に残っている情報から、破損した構造レコードを通常は再構築できるという意味です。たとえば、間接オブジェクトのマーカーを走査して欠落した相互参照索引を作り直したり、符号化済みストリームのバイト数を測って誤ったLength値を修正したりできます。ただし、すべてのページ、フォント、画像、注釈、フォーム値が無傷である保証ではありません。終了していないストリームは、後続オブジェクトの信頼できる境界から終端を特定できるため、高リスクながら修復可能と判定します。一方、曖昧なバイナリデータのため安全に直せない場合もあります。欠落バイトに固有の内容があった切断や、意図された関係を理解しないと文書ルートを選べないカタログ欠落は、自動修復できません。暗号化エラーも、正当な認証情報を得るまで保留となります。元ファイルは変更せず、コピーで作業し、推奨事項とリスクを併せてご確認ください。同じ説明には常に同じ結果を返し、ネットワーク、乱数、言語モデルの解釈は使用しません。
順序付き計画を適用して検証します
生成される計画には修復可能と判定された項目だけが含まれ、検出順が維持されます。そのため検証ログと容易に照合できますが、修復ツールでは関連する変更を1回の書き直しにまとめる必要がある場合があります。可能な限りオブジェクト世代を保ち、使用済み識別子を再利用せず、オブジェクト番号を変更した場合は間接参照も更新してください。ストリーム範囲やオブジェクト位置が変わる場合、相互参照は変更前ではなく変更後に再構築します。各手順には、出力を再解析し、対象の問題が消え、新しい構造エラーが発生していないことを確認する指示があります。最終確認には独立した解析ツールをご使用ください。修復を書き込んだライブラリだけで試すと、共通の前提による不具合を見逃す可能性があります。ページ数と到達可能なオブジェクトグラフを元データと比較し、代表的なページを目視し、重要な対話機能も確認します。構造解析の成功は必要ですが、失われた内容の復元を証明するものではありません。修復不可の項目は記録に残し、黙って除外せず専門家へ引き継いでください。
活用例
検証報告を優先順位付けします
未整理の構造上の検出事項を修復可能な問題と保留すべき問題に分け、技術作業の割り当てに備えます。
復旧工程を計画します
順序付きの推奨事項から再構築段階と各変更後の検証項目を選択できます。
修復判断を記録します
分類、場所、リスク、推奨事項をインシデント記録やアーカイブ復旧記録に添付できます。
よくある質問
この機能はPDF自体を修復しますか?
いいえ。入力された構造上の検出事項を分類して計画を作成しますが、PDFのバイトデータを受信または変更することはありません。
報告書の修復可能とは何ですか?
残存情報から既知の構造修復を導ける可能性が高いという意味です。すべての文書内容を復元できる保証ではありません。
未知の検証メッセージはどうなりますか?
未知の構造問題として自動修復不可に分類し、手動調査を推奨します。
空の問題一覧が拒否されるのはなぜですか?
検出事項がなければ分類も有用な計画の作成もできないため、無効な入力としてエラーを返します。
報告書の料金はいくらですか?
APIリクエスト1回あたり$0.002です。外部モデルやネットワークサービスを使わず、決定論的なローカル処理を行います。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/pdf/repair-report \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"issues":[{"description":"Missing cross-reference table","location":"file trailer"},{"description":"Unterminated stream","location":"object 18"}]}'const res = await fetch("https://api.kit.forhosting.com/pdf/repair-report", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"issues": [
{
"description": "Missing cross-reference table",
"location": "file trailer"
},
{
"description": "Unterminated stream",
"location": "object 18"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/repair-report",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"issues": [
{
"description": "Missing cross-reference table",
"location": "file trailer"
},
{
"description": "Unterminated stream",
"location": "object 18"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/repair-report", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"issues":[{"description":"Missing cross-reference table","location":"file trailer"},{"description":"Unterminated stream","location":"object 18"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"issues":[{"description":"Missing cross-reference table","location":"file trailer"},{"description":"Unterminated stream","location":"object 18"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/repair-report", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"issues": [
{
"description": "Missing cross-reference table",
"location": "file trailer"
},
{
"description": "Unterminated stream",
"location": "object 18"
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.repair_report",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 200 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |