가장 작은 GIF 를 본 간단한 호기심에서 유효한 가장 작은 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
이것은 291 바이트의 PDF 기쁨입니다. 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 바이트입니다. 예고편에 / 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>>
사전에 성가신 / 유형 요소가 모두 필요하지는 않습니다.
%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로 바꾸고 마지막 줄 바꿈을 모두 제거하여 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에는 없습니다. Chrome (FoxIt)에 내장 된 PDF 판독 값은 열리지 않습니다.
PostScript (HA! 내가 한 작업 참조)로 Acrobat이 파일을 "복구"하는 데 동의하면 파일은 최대 3550 바이트 (대부분의 선택적 메타 데이터)에 충돌하지만 여러 가지 명백한 사양 위반이 남아 있습니다.
minimum allowed by the spec
하여 그 이상으로 넘어 가기 때문에 허용됩니다 . 좋은 답변 감사합니다! :)
\n
포함되어 있고 base64로 디코딩 된 경우 올바른 파일 내용을 제공하지 않습니다.
헬로 월드 예제를 열 수 없었습니다.
텍스트 내용이 포함 된 작은 파일의 경우 :
%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 포인트 글꼴에 대해 죄송합니다. 더 큰 바이트는 추가 바이트가 필요합니다. :)
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를 붙여 넣으십시오 (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;
}