Подтвердить что ты не робот

Минимальный PDF-пример в спецификации PDF

Я взял минимальный пример PDF в спецификации PDF из Спецификация PDF, скопировал его в NotePad, переименовал файл, чтобы иметь расширение. PDF.

Я могу открыть его с помощью другого средства просмотра PDF (PDF-XChange, SumatraPDF, MuPDF). Но когда я открываю его с помощью Adobe Reader, он говорит, что файл сломан.

Я не уверен, что другие зрители рассматривают этот "сломанный" файл как пустой файл или нет.

Файл должен отображать одну пустую страницу, так как это минимальный пример.

Фактически, я изменяю минимальный пример. Потому что, когда я копирую его из спецификации PDF в блокнот и открываю файл .txt с помощью Hex Editor, я вижу, что новая строка в TXT файле дает мне 2 пробела. Например,

1 0 obj
<< /Type /Catalog

дает мне (в Hex Editor)

1 0 obj  << /Type /Catalog

который (в шестнадцатеричных значениях)

31 20 30 20 6F 62 6A 0D 0A 3C 3C 20 2F 54 79 70
65 20 2F 43 61 74 61 6C 6F 67

2 пробела между j и < равны 0D 0A.

Следовательно, я не делаю новые строки в NotePad и изменяю значения в части xref.

Ниже приведен полный код.

Знаете ли вы, что не так с этим примером? Почему Adobe Reader говорит, что она сломана? Это потому, что я дал неправильные значения в xref?

%PDF-1.4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj << /Length 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395 %%EOF
4b9b3361

Ответ 1

Сначала:, когда вы скопировали "пример из спецификации PDF", очень вероятно, что произошло несколько событий, из-за чего ваша копия не работала должным образом:

  • ... вы не "скопировали", перепечатав пример в текстовом редакторе, но
  • ... вы использовали copy'n'paste, используя PDF в качестве исходного файла.

В зависимости от вашего текстового редактора этот метод, вероятно, вызвал преобразование соглашения новой строки, которое должно быть изменено с [cr] + [lf] на [cr] или наоборот. Это, в свою очередь, означает, что числа смещения байта в "таблице содержания" объекта ( "xref" - таблица) больше не действительны.

Еще одна проблема с исходным кодом PDF, который вы опубликовали, заключается в том, что он теперь не содержит никаких разрывов строк. Некоторые зрители могут все еще молча разобрать вещь, но не все. И это, безусловно, противоречит спецификации, потому что согласно спецификации, в главе 7.5.2 четко указано, что

"Первая строка PDF файла должна быть заголовком, состоящим из 5 символов% PDF-, а затем номер версии формы 1.N, где N - цифра от 0 до 7.

Ваш заголовок нарушает это правило.

Кроме того, "поток" в 5 0 obj не является допустимым PDF-кодом, это просто текст владельца места (… Page-marking operators …). Некоторые зрители могут наклоняться, когда сталкиваются с таким "мусором".

Наконец, значение startxref неверно.

Итак, вот файл, который работает. Я отремонтировал его в текстовом редакторе, и я положил ваш исходный код в качестве комментария после %%EOF для сравнения и ссылки:

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages /Kids [4 0 R] /Count 1 >>
endobj
4 0 obj
<< /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >>
endobj
5 0 obj
<< /Length 35 >>
stream
… Page-marking operators …
endstream 
endobj
6 0 obj
[/PDF]
endobj
xref
0 7
0000000000 65535 f 
0000000009 00000 n 
0000000074 00000 n 
0000000119 00000 n 
0000000176 00000 n 
0000000295 00000 n 
0000000376 00000 n 
trailer 
<< /Size 7 /Root 1 0 R >>
startxref
394
%%EOF

%% %PDF-1.4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj << /Length 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395