2017-12-11 5 views
-1

docparser를 사용하여 Excel에서 Pdfs로 변환 중입니다. 그러나 docparser에서 스캔 한 pdfs를 제대로 처리 할 수 ​​없습니다. 그래서 일반 PDF 파일에서 스캔 한 pdfs를 분리해야하며 docparser (즉 API 호출)를 통해서만 일반 pdfs를 처리하고 싶습니다. 더 이상 일할 수 있도록 프로그래밍 방식으로의 PDF 유형 (스캔 또는 일반)을 식별 할 수있는 방법이 있습니까? 누구든지이 문제를 해결하는 방법을 알고 있다면 .....정상 (검색 가능) 또는 스캔 (이미지) 여부에 관계없이 프로그래밍 방식으로 (Java에서) PDF를 인식하는 방법은 무엇입니까?

+3

되면, PDF 수준에 당신이 것, 거기에 .. "정상"과 "스캔"PDF 사이에 차이가 없다 그래서 경험적으로해야한다. 예를 들어, 모든 페이지에 용지 크기의 90 % + 이미지가 포함되어 있으면 스캔 한 PDF라는 것을 알 수 있습니다 .. – xs0

+0

일부 스캔 된 PDF는 메타 데이터에 스캐너 브랜드 태그가 있으므로 그것. 그러나 스캐너가 작성된 pdf의 메타 데이터를 추가하거나 수정하지 않으면 식별하기가 정말 어려울 것으로 생각됩니다. –

+0

답변을 주셔서 고맙습니다.하지만 Tabula-Pdf를 Excel 도구에 사용하고 스캔 한 pdf를 업로드하면 "업로드 된 파일이 스캔 된 이미지이므로 정확한 결과를 제공하지 않을 수 있습니다 ...."라는 팝업이 나타납니다. "그래서 나는 스캔 한 Pdfs를 식별 할 수있는 확실한 방법이 존재한다고 생각한다 ... –

답변

0

마지막으로, 내 질문에 대한 해결책을 찾았습니다.하지만 표준이 아닙니다. (나는 생각합니다.) 댓글을 달고 도움을 주신 분들께 감사드립니다. 사실 오면 Pdfbox 라이브러리 우리가 스캔 한 PDF 파일의 페이지를 추출하여 이미지 객체 (PDImageXObject)의 인스턴스에 각 페이지를 비교합니다 사용

, 페이지가 이미지로 계산되며, 우리는 할 수 이미지를 센다. 이미지는 pdf의 페이지 수와 같습니다. 스캔 된 PDF이라고합니다. 여기

코드 ... 내가 아는 한

public static String testPdf(String filename) throws IOException 
{ 
    String s = ""; 
    int g = 0; 
    int gg = 0; 
      PDDocument doc = PDDocument.load(new File(filename)); 

      gg = doc.getNumberOfPages(); 
      for(PDPage page:doc.getPages()) 
      { 
       PDResources resource = page.getResources(); 
       for(COSName xObjectName:resource.getXObjectNames()) 
       { 
        PDXObject xObject = resource.getXObject(xObjectName); 
        if (xObject instanceof PDImageXObject) 
        { 
         ((PDImageXObject) xObject).getImage(); 
         g++; 
        } 


      } 

      } 
      doc.close(); 
     if(g==gg) // pdf pages if equal to the images 
     { 
      return "Scanned pdf"; 
     } 
     else 
     { 
      return "Searchable pdf"; 
     } 



}