Java 如何知道文件类型是否为PDF?

Java 如何知道文件类型是否为PDF?,java,pdf,Java,Pdf,这个答案建议下载另一个库,但我的要求是我只需要检查一个文件是否是PDF类型的目录 将完整库用于此用途看起来有些过分 有没有办法知道Java文件是PDF类型的 这听起来可能有点太明显了,但请检查文件名的扩展名 如果它对explorer来说足够好,那么对您来说也应该足够好。好吧,一种黑客的解决方案是查看完整的文件名,看看它是否以“.pdf”结尾。以下内容应该会有所帮助: import javax.activation.*; public class ShowMimeType {

这个答案建议下载另一个库,但我的要求是我只需要检查一个文件是否是PDF类型的目录

  • 将完整库用于此用途看起来有些过分

  • 有没有办法知道Java文件是PDF类型的

    • 这听起来可能有点太明显了,但请检查文件名的扩展名


      如果它对explorer来说足够好,那么对您来说也应该足够好。好吧,一种黑客的解决方案是查看完整的文件名,看看它是否以“.pdf”结尾。以下内容应该会有所帮助:

      import javax.activation.*;  
      
      public class ShowMimeType  
      {  
          public static void main(String[] args) {  
              FileDataSource ds = new FileDataSource(args[0]);  
              String contentType = ds.getContentType();  
              System.out.println("The MIME type of the file " + args[0] + " is: " + contentType);  
          }  
      }  
      

      好的,根据PDF文件以神奇的数字开始:
      “%PDF”(十六进制25 50 44 46)
      ,因此也许您应该检查文件的输入流并进行检查。

      如果检查文件扩展名不满意,您可以尝试通过读取文件的几个字节来检查文件

      PDF files start with "%PDF" (hex 25 50 44 46).
      

      将较轻的URLCOnnection.guessContentTypeFromStream()与较重的AutoDetectParser相结合,后者对某些MIMetype返回null

      if(currentImageType ==null){
                      ByteArrayInputStream is = new ByteArrayInputStream(image);
                      String mimeType = URLConnection.guessContentTypeFromStream(is);
                      if(mimeType == null){
                          AutoDetectParser parser = new AutoDetectParser();
                          Detector detector = parser.getDetector();
                          Metadata md = new Metadata();
                          mimeType = detector.detect(is,md).toString();
      
                          if (mimeType.contains("pdf")){
                              mimeType ="pdf";
                          }
                          else if(mimeType.contains("tif")||mimeType.contains("tiff")){
                              mimeType = "tif";
                          }
                      }
                      if(mimeType.contains("png")){
                          mimeType ="png";
                      }
                      else if( mimeType.contains("jpg")||mimeType.contains("jpeg")){
                          mimeType = "jpg";
                      }
                      else if (mimeType.contains("pdf")){
                          mimeType ="pdf";
                      }
                      else if(mimeType.contains("tif")||mimeType.contains("tiff")){
                          mimeType = "tif";
                      }
      
                      currentImageType = ImageType.fromValue(mimeType);
                  }
      
      是用于解析内容类型的Java库:

      <!-- pom.xml -->
          <dependency>
              <groupId>com.j256.simplemagic</groupId>
              <artifactId>simplemagic</artifactId>
              <version>1.8</version>
          </dependency>
      

      尝试下面的代码,它的工作

      public static boolean isSelectedFilePdf(Uri uri, ContentResolver contentResolver) {
      if (uri != null) {
              if (uri.getScheme().equals("content")) {
                  String type = contentResolver.getType(uri);
                  return type != null && type.startsWith("application/pdf");
              } else {
                  String fileName = uri.getLastPathSegment();
                  String extension = fileName.substring(fileName.lastIndexOf("."));
                  return extension != null && extension.equalsIgnoreCase(".pdf");
              }
          }
      }
      

      下面的解决方案在

      在一个项目中,如果我需要检查一些上传文件的mime类型。我只是像这样使用file命令:

      from subprocess import Popen, PIPE
      filetype = Popen("/usr/bin/file -b --mime -", shell=True, stdout=PIPE, stdin=PIPE).communicate(file.read(1024))[0].strip()
      
      当然,您可能希望将实际命令移动到某个配置文件中,因为命令行选项在不同的操作系统(例如mac)中也有所不同


      如果您只需要知道它是否是PDF,并且不需要处理它,我认为file命令是一个比lib更快的解决方案。当然也可以手工操作,但是如果您想检查不同的类型,file命令可能会给您带来更大的灵活性。

      为什么不使用库呢?这个用例是什么?查看扩展通常不是一个好主意,因为任何人和任何其他程序都可以更改扩展。如果不查看文件,就很难确定它是否真的是PDF。为此,我建议你使用一个库。相关/重复:试着看看@peshkira,应该是这样的。你很少不相信它。你的评论基于什么理由。你怎么能说它很少?这取决于用例。你说它很少发生,因为你可能没有做过或没有遇到过它,但这并不意味着它在现实世界中不会发生。我想说,将设计决策建立在Microsoft Explorer的工作方式上是个坏主意。。。。我想大多数人都会同意Windows并不是完美的(而且远不是完美的)。只是在notepad++中打开了一个PDF,它确实做到了+1是的,我有一个类似的用例,Wikipedia非常有帮助,但是如果你制作一个文本文件,然后从%PDF-1.4开始,只是为了搞定它呢op@SamIam-听起来像是另一个支持使用库的论点。确切地说,因为这类东西,我会使用库,比如ApacheTika,PronomDroid,JHove或任何其他识别工具,因为它们不仅查看签名,还查看整个格式和尾随字节,并提供mime、格式和版本等特定信息。
      from subprocess import Popen, PIPE
      filetype = Popen("/usr/bin/file -b --mime -", shell=True, stdout=PIPE, stdin=PIPE).communicate(file.read(1024))[0].strip()