回答:
これは興味深い問題です。本でそれを取ると、あなたはこれで始めることができます:
%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バイト(ほとんどはオプションのメタデータ)にぶつかりますが、多くの明確な仕様違反が残ります。
minimum allowed by the spec
、その後さらに上へ行くため、受け入れられました。すばらしい回答、ありがとうございます。:)
\n
sが埋め込まれており、base64でデコードされたバージョンでは正しいファイルコンテンツが提供されません。
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
「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
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;
}