2012-06-04 10 views
3

현재 PDF 파일에서 중요한 키워드를 자동으로 추출하려고합니다. 텍스트 정보를 PDF 문서에서 가져올 수 있습니다. 하지만 이제는이 키워드가 가지고있는 폰트 크기와 폰트 패밀리를 알아야합니다.iText - 텍스트 세그먼트의 글꼴 크기 및 패밀리 얻기

홈페이지

public static void main(String[] args) throws IOException { 
    String src = "SEM_081145.pdf"; 

    PdfReader reader = new PdfReader(src); 

    SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy(); 

    PrintWriter out = new PrintWriter(new FileOutputStream(src + ".txt")); 
    Rectangle rect = new Rectangle(70, 80, 490, 580); 
    RenderFilter filter = new RegionTextRenderFilter(rect); 

    for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
     // strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter); 
     out.println(PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy)); 
    } 
    out.flush(); 
    out.close(); 
} 

그리고 나는이처럼 보이는 TextExtraction 전략 SemTextExtractionStrategy 구현 :

다음 코드는 이미이

public class SemTextExtractionStrategy implements TextExtractionStrategy { 

private String text; 

@Override 
public void beginTextBlock() { 
} 

@Override 
public void renderText(TextRenderInfo renderInfo) { 
    text = renderInfo.getText(); 

    System.out.println(renderInfo.getFont().getFontType()); 

    System.out.print(text); 
} 

@Override 
public void endTextBlock() { 
} 

@Override 
public void renderImage(ImageRenderInfo renderInfo) { 
} 

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

내가 fontType을 얻을 수 있습니다 그러나 글꼴 크기를 얻는 방법은 없습니다. 다른 방법이 있습니까, 또는 현재 텍스트 세그먼트의 글꼴 크기를 어떻게 얻을 수 있습니까?

또는 TextSegments에서 글꼴 크기를 가져올 수있는 다른 라이브러리가 있습니까? 이미 PDFBox와 PDFTextStream을 살펴 보았습니다. Aspose의 PDF 셰어웨어 라이브러리가 완벽하게 작동합니다. 하지만 비용이 많이 들고 오픈 소스 프로젝트를 사용해야합니다.

답변

3

당신은 특히이 코드에서 this answer에서 제공하는 코드를 적용 할 수 있습니다

Vector curBaseline = renderInfo.GetBaseline().GetStartPoint(); 
Vector topRight = renderInfo.GetAscentLine().GetEndPoint(); 
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(curBaseline[Vector.I1], curBaseline[Vector.I2], topRight[Vector.I1], topRight[Vector.I2]); 
Single curFontSize = rect.Height; 

이 대답은 C#으로하지만 API는 자바로의 전환은 간단합니다 너무 비슷합니다. 나는 자바 코드에 자신의 C# 솔루션을 변환 할 수 알렉시스에

+0

Thx, 나중에 사용해보고 다른 사용자의 자바 코드를 게시하십시오.) – Prine

+0

작동 중입니다! Java 솔루션을 하나의 대답으로 게시 할 것입니다. 다시 한 번 감사드립니다! – Prine

+0

이 계산에 관한 질문. 여기에서 기본 선이나 하강 선을 사용해야합니까? 하강 선을 사용하면 결과 숫자가 다른 응용 프로그램 (예 : OS X 미리보기 PDF 주석 도구)에 표시된 "글꼴 크기"와 더 잘 일치하는 것 같습니다. – Thilo

7

감사합니다 : 제대로 회전 된 텍스트를 처리하지 않기 때문에

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(); 
+1

모든 크레딧은 원래의 답변을 제공 한 Chris Haas에게 가야합니다. –

4

나는 몇 가지 문제 알렉시스를 사용하여 '및 Prine의 솔루션을했다. 다른 답변에 표시된대로

float fontsize = renderInfo.getAscentLine().getStartPoint().get(1) 
    - renderInfo.getDescentLine().getStartPoint().get(1); 

이 수정 : 당신이 정확한 글꼴 크기를 원하는 경우

val x0 = info.getAscentLine.getEndPoint 
val x1 = info.getBaseline.getStartPoint 
val x2 = info.getBaseline.getEndPoint 
val length1 = (x2.subtract(x1)).cross((x1.subtract(x0))).lengthSquared 
val length2 = x2.subtract(x1).lengthSquared 
(length1, length2) match { 
    case (0, 0) => 0 
    case _ => length1/length2 
} 
0

, 당신의 renderText에 다음 코드를 사용 : 그래서 이것은 내가 (죄송합니다, 스칼라) 할 것입니다 칭찬 된 텍스트.