【发布时间】:2013-03-21 06:25:13
【问题描述】:
好的,在我们开始之前。我在一家公司工作,该公司拥有从各种出版商以任何媒体形式重新分发 PDF 文件的许可证。因此,话虽如此,从给定的 PDF 文件中提取嵌入字体不仅是合法的,而且对演示文稿也至关重要。
我正在使用在这个网站上找到的代码,但是我不记得作者了,当我找到它时,我会参考它们。我在包含嵌入字体的 PDF 文件中找到了流,我已将此编码流隔离为字符串,然后将其隔离为 byte[]。当我使用以下代码时出现错误
Block length does not match with its complement.
代码(错误出现在下面的while行):
private static byte[] DecodeFlateDecodeData(byte[] data)
{
MemoryStream outputStream;
using (outputStream = new MemoryStream())
{
using (var compressedDataStream = new MemoryStream(data))
{
// Remove the first two bytes to skip the header (it isn't recognized by the DeflateStream class)
compressedDataStream.ReadByte();
compressedDataStream.ReadByte();
var deflateStream = new DeflateStream(compressedDataStream, CompressionMode.Decompress, true);
var decompressedBuffer = new byte[compressedDataStream.Length];
int read;
// The error occurs in the following line
while ((read = deflateStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)) != 0)
{
outputStream.Write(decompressedBuffer, 0, read);
}
outputStream.Flush();
compressedDataStream.Close();
}
return ReadFully(outputStream);
}
}
在使用常用工具(Google、Bing、此处的存档)后,我发现大多数情况下发生这种情况是因为一个人没有消耗编码流的前两个字节 - 但这是在这里完成的,所以我不能找到这个错误的根源。下面是编码流:
H‰LT}lg?7ñù¤aŽÂ½ãnÕ´jh›Ú?-T’ÑRL–¦
ëš:Uí6Ÿ¶“ø+ñ÷ùü™”ÒÆŸŸíóWlDZ“ºu“°tƒ¦t0ÊD¶jˆ
Ö m:$½×^*qABBï?Þç÷|ýÞßóJÖˆD"yâP—òpgÇó¦Q¾S¯9£Û¾mçÁçÚ„cÂÛO¡É‡·¥ï~á³ÇãO¡ŸØö=öPD"d‚ìA—$H'‚DC¢D®¤·éC'Å:È—€ìEV%cÿŽS;þÔ’kYkùcË_ZÇZ/·þYº(ý݇Ã_ó3m¤[3¤²4ÿo?²õñÖ*Z/Þiãÿ¿¾õ8Ü ?»„O Ê£ðÅP9ÿ•¿Â¯*–z×No˜0ãÆ-êàîoR‹×ÉêÊêÂulaƒÝü
请帮忙,我在这里撞墙了!
注意:上面的流是 Arial Black 的编码版本 - 根据 PDF 中的规范:
661 0 obj
<<
/Type /FontDescriptor
/FontFile3 662 0 R
/FontBBox [ -194 -307 1688 1083 ]
/FontName /HLJOBA+ArialBlack
/Flags 4
/StemV 0
/CapHeight 715
/XHeight 518
/Ascent 0
/Descent -209
/ItalicAngle 0
/CharSet (/space/T/e/s/t/a/k/i/n/g/S/r/E/x/m/O/u/l)
>>
endobj
662 0 obj
<< /Length 1700 /Filter /FlateDecode /Subtype /Type1C >>
stream
H‰LT}lg?7ñù¤aŽÂ½ãnÕ´jh›Ú?-T’ÑRL–¦
ëš:Uí6Ÿ¶“ø+ñ÷ùü™”ÒÆŸŸíóWlDZ“ºu“°tƒ¦t0ÊD¶jˆ
Ö m:$½×^*qABBï?Þç÷|ýÞßóJÖˆD"yâP—òpgÇó¦Q¾S¯9£Û¾mçÁçÚ„cÂÛO¡É‡·¥ï~á³ÇãO¡ŸØö=öPD"d‚ìA—$H'‚DC¢D®¤·éC'Å:È—€ìEV%cÿŽS;þÔ’kYkùcË_ZÇZ/·þYº(ý݇Ã_ó3m¤[3¤²4ÿo?²õñÖ*Z/Þiãÿ¿¾õ8Ü ?»„O Ê£ðÅP9ÿ•¿Â¯*–z×No˜0ãÆ-êàîoR‹×ÉêÊêÂulaƒÝü
【问题讨论】:
-
如果我对您的理解正确,您只有一个(或数量有限的)PDF 文件会遇到这个问题,但通常它可以正常工作。因此,问题可能出在那些 PDF 上。可以提供样品吗?
-
@mkl,不,我从来没有做过这项工作。我怀疑问题在于我如何尝试将字体对象转换为流,它应该来自我从中获取它的字符串 - 但我不确定。我将流字符串放入字符串中,然后使用“Encoding.UTF8.GetBytes(stringValue);”转换为字节数组。
标签: c# pdf itextsharp pdfbox embedded-fonts