2017-02-22 13 views
1

Я пытаюсь извлечь вращение PDF с TextRenderInfo, но я не знаю, как вычислить.Как извлечь ротацию

Я прочитал, что я могу рассчитывать с базовой линии, но я не знаю, как

Метод испытания

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

И очевидное предупреждение: не делите на ноль. 'x1 == x2' не редко, учитывая, как часто используется поворот страницы на 90 °. – mkl

+0

Спасибо, я попробую –

Смежные вопросы