4

現在、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();
}

SemTextExtractionStrategyそして、次のようなTextExtraction Strategy を実装しました。

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 シェアウェア ライブラリは、その仕事を完璧にこなしてくれます。しかし、それは非常に高価で、オープン ソース プロジェクトを使用する必要があります。

4

4 に答える 4

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();
于 2012-06-06T15:51:25.183 に答える
6

回転されたテキストを正しく処理しないため、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
}
于 2012-06-15T12:41:13.713 に答える
3

この回答で提供されているコード、特に次のコード スニペットを適合させることができます。

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 への変換は簡単です。

于 2012-06-05T11:26:34.073 に答える
1

正確なフォントサイズが必要な場合は、renderText で次のコードを使用します。

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

ローレートされたテキストの他の回答に示されているように、これを変更します。

于 2015-11-03T23:21:15.233 に答える