2012-06-04 37 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文本。

相关问题