2012-06-04 69 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 Shareware Library可以完美地完成這項工作。但它非常昂貴,我需要使用一個開源項目。

回答

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是如此的相似,轉換成Java應該直截了當。

+0

Thx,稍後再嘗試併發布其他人的java代碼;) – Prine

+0

它正在工作!將發佈我的Java解決方案作爲一個答案。再次感謝! – Prine

+0

關於這個計算的問題。我們應該在這裏使用基線還是下降線?如果我使用下降線,結果數字似乎更好地匹配其他應用程序(如OS X預覽PDF註釋工具)顯示的「字體大小」。 – Thilo

7

感謝亞歷克西斯我自己C#的解決方案轉換成Java代碼:

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和解決方案,因爲它不與文本旋轉處理正確。所以這是我做的(對不起,斯卡拉):

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:

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

修改本作中其他的答案顯示爲rorated文本。

相關問題