最小的有效PDF是什么?

最小的有效PDF是什么?,pdf,optimization,pdf-generation,Pdf,Optimization,Pdf Generation,出于简单的好奇,已经看过了,最小的有效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 00

出于简单的好奇,已经看过了,最小的有效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
我试着去掉最后一本字典(>>),但Acrobat没有。谷歌Chrome(FoxIt)内置的PDF阅读功能无法打开它


作为一个附言(哈!看到我在那里做了什么吗?),如果你同意Acrobat“修复”文件,它会增加3550字节,大部分是可选的元数据,但它会留下一些明显的规范冲突。

我想我会制作一个最小的pdf,显示“Hello World”。文本在左下角。抱歉,9点字体,任何较大的字体都需要额外的字节:)

Adobe Reader X为172字节(如果仅使用换行符保存,且没有尾随换行符或空字节):


我无法打开hello world示例

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

%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
%PDF-1.2
9.0 obj
>
流动
BT/9 Tf(测试)ET
尾流
endobj
40 obj
>
endobj
50 obj
>
endobj
30 obj
>
endobj
拖车
>
%%EOF
在Java中,使用以下命令:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";
然后

byte[] bytes = hexStringToByteArray(samplepdf);

public byte[]hexStringToByteArray(字符串s){
int len=s.length();
字节[]数据=新字节[len/2];
对于(int i=0;i
%PDF-(空)预告片

其中(NULL)是不可打印的ASCII 0字符


然而,正如Ange所指出的,虽然此PDF在技术上是有效的,但大多数PDF阅读器应用程序仅根据大小就将其视为无效,因此无法打开它。

根据此处的所有答案,以下是最小的带文本的PDF:

SMALL\u PDF=(
b“%PDF-1.2\n”
b“9 0 obj\n\n流\nBT/32 Tf(此处的文本)'ET\nendstream\nendobj\n”
b“4 0对象\n\nendobj\n”
b“5 0对象\n\nendobj\n”
b“3 0对象\n\nendobj\n”
b“拖车\n\n”
b“%%EOF”
)
作为base64。复制此项并在Chrome中测试:

数据:application/pdf;base64,jvberi0xljigcjkgmcbvymokpdwkpj4kc3ryzwftckjulyazmibuziggigiflpvvigvyvcgqzw5kc3ryzwftcmvuzg9iago0idagb2jqqcjw9uexblic9qywdlci9qyw9qyyxj9qyxjbnvjlbnrzyzwkgj4+cmvuzg9iago1idg2jcqc8ci9lawzg0idg0idg9idg9idgjw9c3vw9c3vw9cw9cjjw9c9c9cw9cw9cjjjjw9c9cw9cw9czg9cw9cw9cw9cw9cw9cw9c9cwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4+CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4+CiUlRU9G

要使页面更大,请调整MediaBox尺寸:)

/MediaBox[0 0 250 50]


取决于您如何创建它。您可以自己(在编辑器中)编写一个比应用程序生成的更小的。尝试将“showpage”(不带引号)提供给ghostscript或ps2pdf。结果还表明,当规范说“应为间接引用”时,需要/Count,并且头“必须”be%PDF-1.0,他们提出了松散的建议。不,这些不是松散的建议,这些是有效性的要求。即使一些PDF查看器不执行这些建议,不遵循这些建议也意味着无效,OP要求有效的PDF。接受,因为答案从规范允许的
最小值开始,然后在上面和后面你的回答很好,谢谢!:)这是规范。PDF中的对象图有循环。我需要PDF的base64表示形式。因此,如果有人感兴趣,这里是138字节版本的base64字符串:
jvberi0xljakmaswig9iajw8l1bhz2vzidigmcbspj5lbmrvymogmiawig9iajw8l0tpzhnbmayaw\nIFJdL0NvdW50IDE+pmvuzg9iazidagb2jqpdwwvtwwvkkkwb3hbmcawidgmgm10+pmvuzg9igp0\mfpbgVyPDwvUm9vdCAxIDAgUj4+Cg=
…这是67字节版本的base64字符串版本:
jvberi0xlg10cmfpgvypdwvum9vddw8l1bhz2vzpdwvs2lkc1s8pc9nzwrpyujvefswidagmyazxt4+XT4+Pj4+Pg=
非常小;但是,根据规范,它不会在Chrome下为我打开。这不起作用,你需要定义一个字体资源ce并在页面内容中选择它以显示文本。此文件实际上在Mac OS X El Capitan下打开,而PDF1.0的评分最高的答案没有打开。也在chrome下打开,数据为:application/pdf;base64,jvberi0xljigjgjgkgmcbvymokpdwkj4kc3ryzwftckjuly5ifrmkfrlc3qpjybfvapplbmrzjjjlywkzwkzwkzw5kb2ukl1bhcmvudcA1IDAGUGOVOQ29UDGVUDHMGOSAWIFIKPJ4KZW5KB2JQCJUMCBYMOKPDWKL0TPZHMGWZGMCBSIF0KL0NVDW50IDEKL5GUGL1BHZ2VZCI9NZWRPYJVECBIDAGMCA55IF0KPJ4KZW5KB2JQCJMCBYMOKPDWKL1BHZ2VZIDUGMCI9NZJ4+CMVUZG9IAGP0290CMFPBGVYC8CI9IDMCBSJ4+CiUlRU9G@yms你有什么例子吗?OP要求尽可能最小的有效PDF文件;你的是我的根据规范,它是无效的。根据规范(比讲座更重要),它在技术上是无效的。存在多个问题,缺少交叉引用,直接对象,其中需要间接对象。。。
%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>
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 
%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>>>>
%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>
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
 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;
}