2014-01-15 6 views
1

PDF에서 데이터를 추출하고 특정 카테고리로 분할하려고합니다. PDF에서 데이터를 추출하고 범주에 따라 글꼴을 기준으로 분할 할 수 있습니다. 크기. 예를 들면 : 3 개의 카테고리, 국가 카테고리, 자본 카테고리 및 도시 카테고리가 있다고합시다. 모든 국가, 수도 및 도시를 각각의 범주에 넣을 수 있습니다. 그러나 어떤 자본이 어떤 도시에 속하고 어떤 국가 또는 어떤 국가가 어떤 도시 및 자본에 속하는지 매핑 할 수는 없습니다. * 무작위로 데이터를 읽는 중, 순서를 어기 지 않고 아래에서 위로 데이터를 읽을 수 있으므로 첫 번째 범주에 첫 번째 단어를 넣고 두 번째에 두 번째 단어를 넣을 수 있습니다. *PDF에서 데이터를 추출하고 Java를 사용하여 particluar 카테고리로 분할하는 방법

또는 누구나 좀 더 효율적인 방법을 알고 계십니까? 그래서 각 카테고리에 텍스트를 넣고 매핑 할 수 있습니다.

public class readPdfText { 


public static void main(String[] args) { 

    try{ 
     PdfReader reader = null; 

    String src = "pdffile.pdf"; 
    try { 

     reader = new PdfReader("pdfile.pdf"); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    SemTextExtractionStrategy smt = new SemTextExtractionStrategy(); 


     for (int i = 1; i <= reader.getNumberOfPages(); i++) { 

     PdfTextExtractor.getTextFromPage(reader, i, smt); 

     } 

    }catch(Exception e){ 

    } 
} 

} 

SemTextExtractionStrategy 클래스 :

public class SemTextExtractionStrategy implements TextExtractionStrategy { 

private String text; 
StringBuffer str = new StringBuffer(); 
StringBuffer item = new StringBuffer(); 
StringBuffer cat = new StringBuffer(); 
StringBuffer desc = new StringBuffer(); 
float temp = 0; 

@Override 
public void beginTextBlock() { 
} 

@Override 
public void renderText(TextRenderInfo renderInfo) { 

    text = renderInfo.getText(); 

    Vector curBaseline = renderInfo.getBaseline().getStartPoint(); 
    Vector topRight = renderInfo.getAscentLine().getEndPoint(); 

    Rectangle rect = new Rectangle(curBaseline.get(0), curBaseline.get(1), 
      topRight.get(0), topRight.get(1)); 
    float curFontSize = rect.getHeight(); 

    compare(text, curFontSize); 


} 

private void add(String text2, float curFontSize) { 

    str.append(text2); 
    System.out.println("str: " + str); 
} 

public void compare(String text2, float curFontSize) { 
    // text2.getFont().getBaseFont().Contains("bold"); 
    // temp = curFontSize; 
    boolean flag = check(text); 
    if (temp == curFontSize) { 

     str.append(text); 

     /* 
     * if (curFontSize == 11.222168){ item.append(str); 
     * System.out.println(item); }else if (curFontSize == 10.420532){ 
     * desc.append(str); } 
     */ 
     // str.append(text); 
    } else { 


     if (temp>9.8 && temp<10){ 
      String Contry= str.toString(); 
      System.out.println("Contry: "+Contry); 

     }else if(temp>8 && temp <9){ 
      String itemPrice= str.toString(); 
      System.out.println("itemPrice: "+itemPrice); 
     }else if(temp >7 && temp< 7.2){ 
      String captial= str.toString(); 
      System.out.println("captial: "+captial); 
     }else if(temp >7.2 && temp <8){ 
      String city= str.toString(); 
      System.out.println("city: "+city); 
     }else{ 
      System.out.println("size: "+temp+" "+"str: "+str); 
     } 
     temp = curFontSize; 
     // System.out.println(temp); 
     str.delete(0, str.length()); 

     str.append(text); 
    } 

} 

private boolean check(String text2) { 

    return true; 
} 

@Override 
public void endTextBlock() { 
} 

@Override 
public void renderImage(ImageRenderInfo renderInfo) { 
} 

@Override 
public String getResultantText() { 
    return text; 
} 

}

답변

1

내가 읽을 수있는 방법, 무작위로 데이터를 읽고 난 자바와 여기에 을 사용하고

내 코드입니다 시퀀스를 깨지 않고 아래에서 위로 데이터를 가져올 수 있으므로 첫 번째 단어를 첫 번째 범주에 넣을 수 있습니다. 두 번째로 두 번째 등등.

아니오, 콘텐츠 스트림에서 해당 그리기 작업의 순서는 무작위가 아니라 무작위입니다.

TextExtractionStrategy 구현 SemTextExtractionStrategy은 전달 된 순서대로 그 텍스트를 사용합니다. 그러나 각 그리기 작업은 페이지의 사용자 정의 위치에서 시작할 수 있으므로 그리기 작업의 순서는 읽기 순서 일 필요는 없습니다. 한 페이지에 여러 글꼴이 사용 된 경우, 예를 들어 텍스트를 글꼴별로 그룹화 할 수 있습니다.

그런 문서에서 텍스트를 분석하려면 먼저 얻은 텍스트 조각을 수집하고 정렬해야하며 페이지의 모든 텍스트가 구문 분석 되어야만 분석을 시작할 수 있습니다.

iText 배포본에 포함 된 LocationTextExtractionStrategy은이를 수행하는 전략의 예입니다. 그래도 내부 클래스 TextChunk을 사용하여 조각을 수집하지만이 클래스는 코드에서 사용하는 텍스트 상승 정보를 전달하지 않습니다.

SemLocationTextExtractionStrategy 따라서 정보 (또는 텍스트 카테고리와 같은 일부 정보 (예 : 텍스트 카테고리))를 유지하려면 확장 TextChunk 클래스를 사용해야합니다.

또한 LocationTextExtractionStrategy은 왼쪽에서 오른쪽으로 위에서 아래로 정렬됩니다. PDF의 디자인이 다른 경우 (예 : 다중 열이있는 경우 정렬을 조정해야하거나 필터를 사용하고 열을 기준으로 페이지 열을 분석해야합니다.

BTW, 당신의 코드는베이스 라인 위의 실제 폰트 크기 만 등반을 반환하지 않습니다 글꼴 크기

Vector curBaseline = renderInfo.getBaseline().getStartPoint(); 
Vector topRight = renderInfo.getAscentLine().getEndPoint(); 

Rectangle rect = new Rectangle(curBaseline.get(0), curBaseline.get(1), 
     topRight.get(0), topRight.get(1)); 
float curFontSize = rect.getHeight(); 

를 결정합니다. 그리고 심지어 회전되지 않은 텍스트에만 해당됩니다. 회전이 게임의 일부가되자 마자 코드는 기준선의 시작에서 상승 선의 끝까지 선을 둘러싸는 직사각형의 높이만 반환합니다. 기선 시작부터 상승선 시작까지의 선의 길이는 적어도 회전과는 독립적 일 것입니다.

또는 누구나 좀 더 효율적인 방법을 알고 있습니까??

귀하의 작업은 정보를 추출하려는 PDF에 많이 의존하는 것으로 보입니다. 따라서 PDF가 없으면보다 효율적인 방법에 대한 요령이 애매하게 남습니다.

+0

감사합니다.하지만 일부 코드를 공유해 주시면 제 요구 사항을 충족시킬 수 있습니다. 사실 나는 많은 노력을했지만 어느 곳에도 도달하지 못했습니다. – Shammi

+1

당신의 작업은 정보를 추출하려고하는 PDF에 많이 의존하는 것 같습니다. 따라서 PDF가 없으면보다 효율적인 방법에 대한 요령이 애매하게 남습니다. – mkl

관련 문제