iText - получить размер шрифта и семейство текстового сегмента
В настоящее время я пытаюсь автоматически извлечь важные ключевые слова из файла 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. PDF Shareware Library от Aspose отлично справится с этой задачей. Но это очень дорого, и мне нужно использовать проект с открытым исходным кодом.
4 ответа
Вы можете адаптировать код, приведенный в этом ответе, в частности этот фрагмент кода:
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 должно быть простым.
Благодаря Алексису я смог преобразовать его решение 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();
У меня возникли некоторые проблемы с использованием решения Алексис и Прине, поскольку оно неправильно обрабатывает повернутый текст. Вот что я делаю (извините, в 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
}
Если вы хотите точный размер шрифта, используйте следующий код в вашем renderText:
float fontsize = renderInfo.getAscentLine().getStartPoint().get(1)
- renderInfo.getDescentLine().getStartPoint().get(1);
Измените это, как указано в других ответах для повернутого текста.