首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iText -获取文本段的字体大小和系列

iText -获取文本段的字体大小和系列
EN

Stack Overflow用户
提问于 2012-06-04 09:48:23
回答 4查看 11.5K关注 0票数 4

目前,我正试图从PDF文件中自动提取重要的关键字。我能够从PDF文档中获取文本信息。但现在我需要知道,哪些字体大小和字体家族这些关键字。

我已经有以下代码:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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共享软件库将完美地完成这项工作。但是它非常昂贵,我需要使用一个开源项目。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-05 11:26:34

您可以修改this answer中提供的代码,特别是以下代码片段:

代码语言:javascript
复制
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的转换应该是非常简单的。

票数 3
EN

Stack Overflow用户

发布于 2012-06-06 15:51:25

多亏了Alexis,我才能将他的C#解决方案转换成Java代码:

代码语言:javascript
复制
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();
票数 10
EN

Stack Overflow用户

发布于 2012-06-15 12:41:13

我在使用Alexis和Prine的解决方案时遇到了一些困难,因为它不能正确地处理旋转的文本。这就是我要做的(抱歉,在Scala中):

代码语言:javascript
复制
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
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10879336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档