最小の有効なPDFは何ですか?


139

単純な好奇心から、最小のGIFを見て可能な最小の有効なPDFファイルは何ですか?


作成方法によって異なります。おそらく、アプリケーションが生成するものよりも小さいものを(エディターで)自分で作成できるようになるでしょう。
devnull 2013年

"showpage"(引用符なし)をghostscriptまたはps2pdfにフィードしてみてください。
devnull 2013年

回答:


194

これは興味深い問題です。本でそれを取ると、あなたはこれで始めることができます:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000053 00000 n
0000000102 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
149
%EOF

これは291バイトのPDFジョイです。Acrobatはそれを開きますが、多少不満があります。その中に1つのページがあり、それは3/72インチの正方形で、仕様で許可されている最小値です。

ただし、Acrobat Xは相互参照表を使用する必要がなくなったため、次のように削除できます。

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Size 4/Root 1 0 R>>

Acrobatは文句を言うがそれを開く。現在は178バイトです。トレーラーで/ Sizeは必要ないことがわかります。現在は172です。

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>

辞書にこれらの厄介な/ Type要素はすべて必要ないことがわかります。

%PDF-1.0
1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>

現在は138バイトです。

また、仕様に「間接参照である必要がある」と/ Countが必要であり、ヘッダーが「%PDF-1.0」である必要がある場合、それらは緩やかな提案をしていることがわかります。これは私が作ることができる最小のサイズであり、Acrobat Xで開くことができます。

%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>

70バイト。

現在、私のエディターはWindowsの改行規則を使用していますが、AcrobatはWindows、Mac、またはUnixの規則を受け入れているため、16進エディターを使用して、\ r \ nを\ rに置き換え、最後の改行を完全に削除しました。

25 50 44 46 2D 31 2E 0D 74 72 61 69 6C 65 72 3C 
3C 2F 52 6F 6F 74 3C 3C 2F 50 61 67 65 73 3C 3C 
2F 4B 69 64 73 5B 3C 3C 2F 4D 65 64 69 61 42 6F 
78 5B 30 20 30 20 33 20 33 5D 3E 3E 5D 3E 3E 3E 
3E 3E 3E 

最後の最後の辞書(>>)を削除しようとしましたが、Acrobatにはありませんでした。Google Chromeに組み込まれているPDF読み取り(FoxIt)では、PDFを開けません。

PostScript(HA!私がそこで何をしたか参照してください)として、Acrobatがファイルを「修復」することに同意すると、最大3550バイト(ほとんどはオプションのメタデータ)にぶつかりますが、多くの明確な仕様違反が残ります。


25
また、仕様に「間接参照である必要がある」と/ Countが必要であり、ヘッダーが「%PDF-1.0」である必要がある場合、それらは緩やかな提案をしていることがわかります。いいえ、それらは緩い提案ではありません。これらは有効性の要件です。一部のPDFビューアがそれらを強制しない場合でも、それらを順守しないことは無効であることを意味し、OPは有効なPDFを要求しました。
mkl

23
回答は「」で始まりminimum allowed by the spec、その後さらに上へ行くため、受け入れられました。すばらしい回答、ありがとうございます。:)
メッシュの2013年

plith、それは素晴らしい答えです。では、「Hello World」のように、テキスト行を含む最小の有効なpdfはどうでしょうか。{stream BT( "Hello World")ET endstream}を追加するのと同じくらい簡単だと思いましたが、これまでのところAcrobatを満足させることはできませんでした。
neonzeon 2013

1
それが仕様です。PDFのオブジェクトのグラフには周期があります。
台座

1
@towi base64でエンコードされたバージョンには\nsが埋め込まれており、base64でデコードされたバージョンでは正しいファイルコンテンツが提供されません。
クリストファーシュルツ

19

Hello Worldの例を開くことができませんでした。

テキストコンテンツを含む小さめのファイルの場合:

%PDF-1.2 
9 0 obj
<<
>>
stream
BT/ 9 Tf(Test)' ET
endstream
endobj
4 0 obj
<<
/Type /Page
/Parent 5 0 R
/Contents 9 0 R
>>
endobj
5 0 obj
<<
/Kids [4 0 R ]
/Count 1
/Type /Pages
/MediaBox [ 0 0 99 9 ]
>>
endobj
3 0 obj
<<
/Pages 5 0 R
/Type /Catalog
>>
endobj
trailer
<<
/Root 3 0 R
>>
%%EOF

2
これは機能しません。テキストを表示するには、フォントリソースを定義してページコンテンツ内で選択する必要があります。
yms

2
このファイルは実際にはMac OS X El Capitanで開きますが、PDF1.0で最も評価された回答は開きませんでした。
Devy

12
また、クロム、データの下に開きます:アプリケーション/ PDF; base64で、JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
ルークRehmann

8

「Hello World」を表示する最小のpdfを作成すると思いました。テキストは左下隅にあります。9ポイントのフォントについては申し訳ありませんが、これより大きいフォントは1バイト余分にかかります:)

Adobe Reader Xの場合は172バイト(改行のみの改行で保存され、末尾の改行またはnullバイトがない場合):

%PDF-1.
1 0 obj<</Kids[<</Parent 1 0 R/Resources<<>>/Contents 2 0 R>>]>>endobj 2 0 obj<<>>stream
BT/ 9 Tf(Hello World)' ET
endstream
endobj trailer<</Root<</Pages 1 0 R>>>>

Chromeの組み込みPDFビューアでは120バイト:

%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>

これをChromeで簡単に確認するには、このURIをアドレスバーに貼り付けます(SOがリンクを許可しないため、他のブラウザーではまったく機能しません)。

data:application/pdf,%25PDF%201%200%20obj%3C%3C%2FPages%3C%3C%2FKids%5B%3C%3C%2FContents%3C%3C%3E%3Estream%0ABT%209%20Tf(Hello%20World)'%20ET%20endstream%3E%3E%5D%3E%3E%3E%3Eendobj%20trailer%3C%3C%2FRoot%201%200%20R%3E%3E

2
かなり小さい。;)しかし、仕様によると無効です。
mkl 2014年

8
Chromeで開かない。
ルークレーマン

0

Javaでは、これを使用します。

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

その後

byte[] bytes = hexStringToByteArray(samplepdf);

...

public byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}

OPは最小の有効なPDFファイルを要求しまし。あなたのものは仕様に従って有効ではありません。
mkl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.