2013-08-26 3 views
4

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

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

Вот текст версия объекта в формате PDF, который рассматривается (\ г \ п в конце каждой строки, просто не видно здесь):

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 для справки (в незашифрованном виде, а также \ г \ п в конце каждой строки, просто не видно здесь):

%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 

ответ

10

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

DeflateStream фактически реализует RFC 1951 (ВЫКАЧИВАЮТ), где в формате PDF сжимается с использованием метода сжатия, совместимый с RFC 1950. Это подробно, с обходным путем, в этом связанном Microsoft Connect bug report.

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

+0

Хм, это интересное изделие. Кроме того, речь идет о процессе ** декомпрессии ** (а не процессе ** сжатия **), но я думаю, что он также отрицательно влияет на сжатие. Я собираюсь попробовать DotNetZip для сжатия и посмотреть, поможет ли это. –

+0

@ m-y yes - тот же вопрос будет происходить с обеих сторон. В целом, однако, я считаю DotNetZip намного лучше, чем встроенные библиотеки сжатия. –

+0

DotNetZip ZlibStream заработал отлично. Интересно, можете ли вы по-прежнему использовать DeflateStream (.NET-4.5) и добавить два недостающих байта в начало при сжатии и пропустить два байта при распаковке? –

Смежные вопросы