Можно ли использовать.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 указывается, что пропуск первых двух байтов может привести к тому, что это сработает в большинстве случаев.