2017-02-22 5 views
1

TextRenderInfoでPDFのローテーションを抽出しようとしていますが、計算方法がわかりません。 ローテーションの抽出方法

は、私は私がベースラインに計算できることを読んで、私は

試験方法

public void test(){ 

    //Extract all the text of PDF 
    ArrayList<InfoText> arrayInfo = extractInfoText(reader, 1); 

    //I want to localize a variable that starts with @ 
    InfoText info = null; 

    for (int i=0; i<arrayInfo.size();i++){ 
     info = arrayInfo.get(i); 
     if (info.getInfo().getText().indexOf("@")!=-1){ 
      break; 
     } 
    } 

    //Know I want to extract de fontsize and the rotation 

    //Font size 
    float size = renderInfo.getAscentLine().getStartPoint().get(1)- renderInfo.getDescentLine().getStartPoint().get(1); 

    //Rotation???? 
    LineSegment line = info.getInfo().getBaseline(); 
    LineSegment asc = info.getInfo().getAscentLine(); 
    LineSegment desc = info.getInfo().getDescentLine(); 


} 

public static ArrayList<InfoText> extractInfoText(PdfReader reader, int intPage) throws IOException { 
    logger.info("UtilesPDF extractText; IN"); 
    logger.info("UtilesPDF.extractText Page {} ", intPage); 
    StringBuilder out = new StringBuilder();  
    ArrayList<InfoText> arrayInfo = new ArrayList<InfoText>(); 
    RenderListener listener = new PdfTextRenderInfo(out, arrayInfo); 
    PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener); 
    PdfDictionary pageDic = reader.getPageN(intPage); 
    PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES); 

    processor.processContent(ContentByteUtils.getContentBytesForPage(reader, intPage), resourcesDic);  
    logger.info("UtilesPDF.extractText Text Page lenght {} ", out.length()); 
    logger.info("UtilesPDF.extractText Text Page arrayCharacters size {} ", arrayInfo.size()); 
    logger.info("UtilesPDF.extractText; OUT"); 
    return arrayInfo; 
} 

誰かが知っている情報を抽出する方法がわかりませんか?

おかげ

答えて

2

これは、幾何学の問題です:

  1. ベースラインはLineSegmentとして表現されます。
  2. LineSegmentから、開始点と終了点を取得できます。これらの二つの点を考えると
  3. 、この式を用いて、線の傾きを計算することができる:線の傾きからequation
  4. には、この式を用いて度単位で回転を計算することができる:formula

以下の例では、手動でLineSegmentインスタンスを作成しました。 info.getInfo().getBaseline()から入手したものを使用してください:

LineSegment baseline = new LineSegment(new Vector(0.0f, 0.0f, 1.0f), 
      new Vector(1.0f, 1.0f, 1.0f)); 

Vector startPoint = baseline.getStartPoint(); 
Vector endPoint = baseline.getEndPoint(); 

float x1 = startPoint.get(Vector.I1); 
float y1 = startPoint.get(Vector.I2); 
float x2 = endPoint.get(Vector.I1); 
float y2 = endPoint.get(Vector.I2); 

float slope = (y2 - y1)/(x2 - x1); 

double rotation = Math.toDegrees(Math.atan(slope)); 

System.out.println(rotation + " degrees"); // prints "45 degrees" 
+1

そして明らかな警告:0で除算しないでください。 x1 == x2は、90度のページ回転の頻度を考慮してめったに起きません。 – mkl

+0

ありがとう、私はしようとする –

関連する問題