有没有任何方法可以在不打开的情况下检查byte[]是否为pdf?
我有一些代码可以将byte[]列表显示为pdf缩略图。我之前知道所有的byte[]都是pdf的,因为我们过滤servlet只返回这些。现在需求已经改变,我需要恢复所有的文件类型。有没有办法检查byte[]是什么,或者更具体地说,确定它是否是pdf?
检查数组的前4个字节。
如果这些是0x25 0x50 0x44 0x46
,那么它很可能是一个PDF文件。
前四个字节应为:0x25 0x50 0x44 0x46
(十六进制格式,ASCII格式为%PDF
)。其他格式的"幻数",您可以在这里找到
据我所知,所有PDF都以%PDF
开头,因此您可以对照此字符串检查第一个字节。
虽然标记的答案和其他答案都是正确的,但它们不会100%成功。问题是PDF规范说%PDF-1.x只需要在前1024个字节中,而不需要在前4个字节中。某些程序会在%PDF之前添加信息,并且仍然有效。
我建议您看看以下堆栈溢出问题的答案:如何检测文件是PDF还是TIFF?
如果有人想要一些基于查找"%"的C#代码PDF";在前1024个字节中,有一些:
public bool IsAPdf(byte[] bytes) {
if(bytes?.Length < 4) return false;
var stopBefore = Math.Min(bytes.Length, 1024) - 3;
for(var i = 0; i < stopBefore; i++)
if(bytes[i] == '%'
&& bytes[i+1] == 'P'
&& bytes[i+2] == 'D'
&& bytes[i+3] == 'F') return true;
return false;
}
我一直有这个问题。我们使用了GitHub的一些Magic库,可以很好地将内容确定为PDF。然而,我们收到了一些
- 在PDF阅读器中打开
%PDF-
之前确实有不同的起始字节(5)- 以这8个字节
0A 0D 0A 30 0D 0A 0D 0A
结尾
因此,我添加了逻辑来检查这些起始字节5-9,以及最后的8个字节,当具有PDF扩展名的文件不匹配时。