如何确定文件是否为 PDF 文件?
2022-09-01 03:34:02
我正在使用Java中的PdfBox从PDF文件中提取文本。提供的某些输入文件无效,PDFTextStripper 会在这些文件上停止。有没有一种干净的方法来检查提供的文件是否确实是有效的PDF?
我正在使用Java中的PdfBox从PDF文件中提取文本。提供的某些输入文件无效,PDFTextStripper 会在这些文件上停止。有没有一种干净的方法来检查提供的文件是否确实是有效的PDF?
以下是我在 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");
}
您可以找出文件(或字节数组)的哑剧类型,因此您不必愚蠢地依赖扩展名。我用aperture的MimeExtractor(http://aperture.sourceforge.net/)来做这件事,或者我几天前看到一个图书馆就是为了这个(http://sourceforge.net/projects/mime-util)
我使用光圈从各种文件中提取文本,不仅是pdf,而且必须调整pdf的想法,例如(光圈使用pdfbox,但是当pdfbox失败时,我添加了另一个库作为回退)