我目前正在尝试从PDF文件中自动提取重要的关键字。我能够从PDF文档中获取文本信息。但现在我需要知道这些关键字的字体大小和字体系列。
我已经拥有以下代码:
主要
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共享软件库将完美地完成这项工作。但它非常昂贵,我需要使用一个开源项目。
答案 0 :(得分:10)
感谢Alexis我可以将他的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 :(得分:4)
您可以调整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应该很简单。
答案 2 :(得分:4)
我在使用Alexis和Prine的解决方案时遇到了一些麻烦,因为它没有正确处理旋转文本。所以这就是我所做的(抱歉,在Scala中):
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
}
答案 3 :(得分:1)
如果您想要精确的fontsize,请在renderText中使用以下代码:
float fontsize = renderInfo.getAscentLine().getStartPoint().get(1)
- renderInfo.getDescentLine().getStartPoint().get(1);
按照漫游文本的其他答案中的说明修改此项。