确定字节[]是否为pdf文件



有没有任何方法可以在不打开的情况下检查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。然而,我们收到了一些

  1. 在PDF阅读器中打开
  2. %PDF-之前确实有不同的起始字节(5)
  3. 以这8个字节0A 0D 0A 30 0D 0A 0D 0A结尾

因此,我添加了逻辑来检查这些起始字节5-9,以及最后的8个字节,当具有PDF扩展名的文件不匹配时。

相关内容

  • 没有找到相关文章

最新更新