如何确定文件是否为 PDF 文件?

2022-09-01 03:34:02

我正在使用Java中的PdfBox从PDF文件中提取文本。提供的某些输入文件无效,PDFTextStripper 会在这些文件上停止。有没有一种干净的方法来检查提供的文件是否确实是有效的PDF?


答案 1

以下是我在 NUnit 测试中使用的内容,这些测试必须针对使用 Crystal Reports 生成的多个版本的 PDF 进行验证:

public static void CheckIsPDF(byte[] data)
    {
        Assert.IsNotNull(data);
        Assert.Greater(data.Length,4);

        // header 
        Assert.AreEqual(data[0],0x25); // %
        Assert.AreEqual(data[1],0x50); // P
        Assert.AreEqual(data[2],0x44); // D
        Assert.AreEqual(data[3],0x46); // F
        Assert.AreEqual(data[4],0x2D); // -

        if(data[5]==0x31 && data[6]==0x2E && data[7]==0x33) // version is 1.3 ?
        {                  
            // file terminator
            Assert.AreEqual(data[data.Length-7],0x25); // %
            Assert.AreEqual(data[data.Length-6],0x25); // %
            Assert.AreEqual(data[data.Length-5],0x45); // E
            Assert.AreEqual(data[data.Length-4],0x4F); // O
            Assert.AreEqual(data[data.Length-3],0x46); // F
            Assert.AreEqual(data[data.Length-2],0x20); // SPACE
            Assert.AreEqual(data[data.Length-1],0x0A); // EOL
            return;
        }

        if(data[5]==0x31 && data[6]==0x2E && data[7]==0x34) // version is 1.4 ?
        {
            // file terminator
            Assert.AreEqual(data[data.Length-6],0x25); // %
            Assert.AreEqual(data[data.Length-5],0x25); // %
            Assert.AreEqual(data[data.Length-4],0x45); // E
            Assert.AreEqual(data[data.Length-3],0x4F); // O
            Assert.AreEqual(data[data.Length-2],0x46); // F
            Assert.AreEqual(data[data.Length-1],0x0A); // EOL
            return;
        }

        Assert.Fail("Unsupported file format");
    }

答案 2

您可以找出文件(或字节数组)的哑剧类型,因此您不必愚蠢地依赖扩展名。我用aperture的MimeExtractor(http://aperture.sourceforge.net/)来做这件事,或者我几天前看到一个图书馆就是为了这个(http://sourceforge.net/projects/mime-util)

我使用光圈从各种文件中提取文本,不仅是pdf,而且必须调整pdf的想法,例如(光圈使用pdfbox,但是当pdfbox失败时,我添加了另一个库作为回退)


推荐