Можно ли использовать.NET DeflateStream для создания PDF?

Я играю с возможностью создавать PDF-файлы с помощью кода C#. Я просматривал спецификации PDF и смог создать работающий файл PDF, сделав путем сбора строк данных и кодирования их в байтовые массивы с использованием кодировки UTF8.

Проблема, с которой я сталкиваюсь, состоит в том, когда я пытаюсь использовать DeflateStream на объектах потока PDF. Это просто не похоже на работу:

Вот текстовая версия рассматриваемого pdf-объекта (\ r \ n находится в конце каждой строки, просто здесь не видно):

5 0 obj
<</Length 45>>
stream
BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET
endstream
endobj

Когда я пытаюсь использовать DeflateStream класс для сжатия строки BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET, PDF, кажется, не работает. Я заметил, что многие другие библиотеки, такие как iTextSharp, используют собственную реализацию сжатия Deflate.

Есть ли какая-то причина, по которой реализация Microsoft класса DeflateStream не работает? Я использую его неправильно или он реализован неправильно или как?


Я знаю, что PDF-файлы являются двоичными (не текстовыми), но если я не шифрую что-либо, то можно просмотреть все это как текст. Вот полный PDF-файл для справки (в незашифрованном виде также \ r \ n находится в конце каждой строки, просто здесь не видно):

%PDF-1.7
1 0 obj
<</Type /Catalog /Pages 2 0 R>>
endobj
2 0 obj
<</Type /Pages /MediaBox [ 0 0 200 200 ] /Count 1 /Kids [ 3 0 R ]>>
endobj
3 0 obj
<</Type /Page /Parent 2 0 R /Resources <</Font <</F1 4 0 R>>>> /Contents 5 0 R>>
endobj
4 0 obj
<</Type /Font /Subtype /Type1 /BaseFont /Times-Roman>>
endobj
5 0 obj
<</Length 45>>
stream
BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET
endstream
endobj
xref
0 6
0000000000 65535 f
0000000017 00000 n
0000000067 00000 n
0000000153 00000 n
0000000252 00000 n
0000000325 00000 n
trailer
<</Size 6/Root 1 0 R>>
startxref
422
%%EOF

1 ответ

Решение

Есть ли какая-то причина, по которой реализация Microsoft класса DeflateStream не работает? Я использую его неправильно или он реализован неправильно или как?

DeflateStream фактически реализует RFC 1951 (DEFLATE), где PDF сжимается с использованием метода сжатия, совместимого с RFC 1950. Это подробно, с обходным путем, в этом связанном отчете об ошибке Microsoft Connect.

Простой обходной путь - использовать стороннюю библиотеку сжатия, такую ​​как DotNetZip, которая будет поддерживать правильный формат. При этом в сообщении Connect указывается, что пропуск первых двух байтов может привести к тому, что это сработает в большинстве случаев.

Другие вопросы по тегам