什么是最小可能的有效PDF?

出于简单的好奇心,看到最小的GIF ,什么是最小的可能有效的PDF文件?

这是一个有趣的问题。 拿着这本书,你可以从这开始:

%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 

这是PDF喜悦的291字节。 Acrobat打开它,但它有点抱怨。 它有一个页面,它是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字节。 原来,你不需要在预告片/大小。 现在我们在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>> 

原来,你不需要你的字典中所有讨厌/types的元素:

 %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个字节。

也就是说,当规范说“应该是一个间接参考”和/或计数是必需的,而标题“必须”是PDF-1.0时,他们正在提出松散的build议。 这是我能做到的最小的,并且可以在Acrobat X中打开:

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

70个字节。

现在,我的编辑器使用Windows新行纪录,但Acrobat接受Windows,Mac或Unix约定,所以通过使用hex编辑器,我用\ rreplace了\ r \ n,并删除了最后一个换行符,这留下了67个字节

 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不会有这个。 谷歌浏览器(FoxIt)内置的PDF阅读器不会打开它。

作为一个PostScript(看看我在那里做了什么?),如果你同意Acrobat“修复”文件,它会碰到高达3550字节,大部分是可选的元数据,但是会留下一些明显的spec违规。

我想我会做一个最小的PDF,显示“你好世界”。 文本在左下angular。 对不起,关于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的内置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粘贴到地址栏中(不会让我链接到它,而在其他浏览器中根本不起作用):

 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 

我无法打开你好世界的例子。

对于包含文本内容的小文件:

 %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