가장 작은 유효한 PDF는 무엇입니까?


139

가장 작은 GIF 를 본 간단한 호기심에서 유효한 가장 작은 PDF 파일은 무엇입니까?


작성 방법에 따라 다릅니다. 응용 프로그램이 생성하는 것보다 더 작은 것을 직접 (편집자에서) 작성할 수 있습니다.
devnull 2016 년

"쇼 페이지"(따옴표없이)를 ghostscript 또는 ps2pdf에 공급하십시오.
devnull 2016 년

답변:


194

이것은 흥미로운 문제입니다. 책으로 가져 가면 다음과 같이 시작할 수 있습니다.

%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 바이트 (대부분의 선택적 메타 데이터)에 충돌하지만 여러 가지 명백한 사양 위반이 남아 있습니다.


25
또한 스펙에 "간접 참조 여야 함"이라고 말하고 / Count가 필요하고 헤더 "%"가 % PDF-1.0이어야 할 때, 그들은 엉뚱한 제안을하고 있다는 것이 밝혀졌습니다. 아니, 그것들은 느슨한 제안이 아니며, 유효성에 대한 요구 사항입니다. 일부 PDF 뷰어가이를 시행하지 않더라도이를 따르지 않으면 무효가되며 OP는 유효한 PDF를 요청했습니다.
mkl

23
대답이로 시작 minimum allowed by the spec하여 그 이상으로 넘어 가기 때문에 허용됩니다 . 좋은 답변 감사합니다! :)
meshy 2016 년

plith, 그것은 대단한 답변입니다. 이제 "Hello World"와 같이 텍스트가 포함 된 가장 작은 유효한 pdf는 어떻습니까? {stream BT ( "Hello World") ET endstream}을 추가하는 것만 큼 간단하다고 생각했지만 지금까지 Acrobat을 만족스럽게 만들 수 없었습니다.
neonzeon

1
그것이 사양입니다. PDF의 객체 그래프에주기가 있습니다.
plinth

1
@towi base64로 인코딩 된 버전이 \n포함되어 있고 base64로 디코딩 된 경우 올바른 파일 내용을 제공하지 않습니다.
Christopher Schultz

19

헬로 월드 예제를 열 수 없었습니다.

텍스트 내용이 포함 된 작은 파일의 경우 :

%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

2
이 기능은 작동하지 않습니다. 글꼴 리소스를 정의하고 페이지 내용 내에서 텍스트를 표시하도록 선택해야합니다.
yms

2
이 파일은 실제로 Mac OS X El Capitan에서 열리지 만 PDF1.0의 가장 높은 답변은 그렇지 않았습니다.
Devy

12
또한 크롬, 데이터에서 열리고 : 어플리케이션 / PDF를,베이스 64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + + CiUlRU9G
루크 Rehmann

8

"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

2
꽤 작습니다. ;) 사양에 따라 유효하지 않습니다.
mkl

8
Chrome에서 아래로 열리지 않습니다.
Luke Rehmann

0

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;
}

OP는 가능한 가장 작은 유효한 PDF 파일을 요청했습니다 . 귀하의 사양에 따라 유효하지 않습니다.
mkl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.