是否可以使用.NET DeflateStream进行pdf创建?

时间:2013-08-26 18:10:25

标签: c# pdf .net-4.5 deflatestream

我正在使用通过C#代码创建pdf文件的能力。我一直在查看PDF规范,并且能够创建一个可用的PDF文件,通过使用UTF8编码将数据字符串编码为字节数组来完成。

我遇到的问题是当我尝试在pdf流对象上使用DeflateStream时。它似乎不起作用:

以下是有问题的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压缩实现。

微软的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 个答案:

答案 0 :(得分:10)

  

微软的DeflateStream类的实现是否有效?我是错误地使用它还是实现不正确或者是什么?

DeflateStream实际上是在实现RFC 1951(DEFLATE),其中PDF是使用与RFC 1950兼容的压缩方法压缩的。这是相关的Microsoft Connect bug report

中的详细信息和解决方法

一个简单的解决方法是使用第三方压缩库,例如DotNetZip,它将支持正确的格式。话虽如此,Connect报告建议跳过前两个字节可能会导致这种情况在大多数情况下都有效。