5

我正在玩弄通过 C# 代码创建 pdf 文件的能力。我一直在查看 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该类来压缩 lineBT 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
4

1 回答 1

11

为什么微软的 DeflateStream 类的实现不起作用?我是使用不正确还是执行不正确还是什么?

DeflateStream实际上正在实施RFC 1951 (DEFLATE),其中 PDF 使用与RFC 1950兼容的压缩方法进行压缩。此相关Microsoft Connect 错误报告中对此进行了详细说明,并提供了解决方法。

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

于 2013-08-26T18:17:19.110 回答