web-dev-qa-db-ja.com

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

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

59
meshy

これは興味深い問題です。本を手に入れて、これから始めることができます:

%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バイトのPDFjoy。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にはありません。 PDF Googleに組み込まれている読書Chrome(FoxIt)は開きません。

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

77
plinth

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

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

%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の組み込みの120バイトPDFビューアー:

%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
8
Hugh Allen

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
8
Alan Riddell