2016-12-29 2 views
1

PDF를 이미지로 렌더링하고 포함 된 모든 이미지의 테두리를 그립니다. 이를 위해 페이지의 이미지 크기가 정확해야합니다. PDF에서 올바른 (회전 된) 이미지 치수 가져 오기

다음 코드와 함께 일하고있다 :

public class PrintImageLocations extends PDFStreamEngine 
{ 
    @Override 
    protected void processOperator(Operator operator, List<COSBase> operands) throws IOException 
    { 
     String operation = operator.getName(); 
     if("Do".equals(operation)) 
     { 
      COSName objectName = (COSName) operands.get(0); 
      PDXObject xobject = getResources().getXObject(objectName); 
      if(xobject instanceof PDImageXObject) 
      { 
       PDImageXObject image = (PDImageXObject)xobject; 
       int imageWidth = image.getWidth(); 
       int imageHeight = image.getHeight(); 

       System.out.println("Found image " + objectName.getName()); 

       Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix(); 
       float imageXScale = ctmNew.getScalingFactorX(); 
       float imageYScale = ctmNew.getScalingFactorY(); 
       // position in user space units. 1 unit = 1/72 inch at 72 dpi 
       System.out.println("position in PDF = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY() + " in user space units"); 
          } 
      else if(xobject instanceof PDFormXObject) 
      { 
       PDFormXObject form = (PDFormXObject)xobject; 
       showForm(form); 
      } 
     } 
     else 
     { 
      super.processOperator(operator, operands); 
     } 
    } 

} 

출처 : PrintImageLocations.java

출력 예 : 사용자 공간 단위로 PDF에서 위치 = 535.68, 97.79052

불행히도 내가 가지고 문제는 페이지가 회전 될 때 발생합니다. "getCurrentPage(). getRotation()"에 90을 반환하는 많은 pdfs가 있습니다. 90 도의 올바른 위치를 얻으려면 getTranslateX 및 getTranslateY 값을 전환해야하지만 이것은 90도에서만 특별히 작동합니다. 위치를 회전시키기 위해 사용할 수있는 유용한 매트릭스 정보가 있습니까?

나는 this 코드에서 저자가이 회전 문제를 해결하려고 시도했으나 1) 변환이 무엇을하는지 이해하지 못하고 2) 회전 한 후에 음수 값을 사용하기 때문에 올바르게 작동하지 않습니다.

답변

0

회전

다음 회전 행렬을 사용하여 유클리드 공간에서 회전을 수행 할 수 있습니다.

반 시계 방향 :

R = ⎡ cosθ -sinθ ⎤ 
    ⎣ sinθ cosθ ⎦ 

시계 방향 :

R = ⎡ cosθ sinθ ⎤ 
    ⎣ -sinθ cosθ ⎦ 

행렬 각각은 원점에 대한 각도 (θ)를 통해 상기 2 차원 직교 좌표 평면에서의 포인트를 회전한다. 이 기술은 각 점이 열 벡터 v으로 표현된다고 가정합니다. 각 점의 새 값은 R * v에 의해 계산됩니다. 여기서 *은 행렬 곱셈을 나타냅니다.


"음"값

이 기술은 두 개의 차원들 중 적어도 하나에 적어도 일부 점 음수 (어쨌든 초기 값 상대 등)를 생성 할 것이다. 데카르트 원점을 기준으로이 값을 보정하려면 회전 된 이미지를 min(y) - min(y') 및 "right"를 min(x) - min(x')으로 번역하십시오. 여기서 min(d)은 임의의 점의 해당 치수에 따른 최소값을 나타냅니다. 당신이 자신의 모든 상용구를 할 필요가 없다는

그래서 라이브러리를 사용하여


, 당신은 AffineTransform 클래스를 살펴 보셔야합니다.

+0

1. 정말이야 (나는 문제가 컴퓨터 앞에 앉아 생각) 작동하지 않았다 ... 그것은 어떤 수학 작업 GT는 수 생각 행복한 누군가가 내 문제를 이해 ^^ – FlavorFlav

+0

2. 감사합니다! 이 작품은 ...나는 뒤에있는 수학을 이해하지 못합니다. 그러나 그 "부정적인 가치"- 정정은 정확히 내가 찾던 것이 었습니다 ... 모든 회전 각도에서 작동하는 것처럼 보입니다. – FlavorFlav

+1

@FlavorFlav 그것이 당신에게 효과적입니다! 이 문제가 해결되면 내 대답을 upvote 받아 받아 들여야합니다. – Travis

0

OK ... 나는 불행히도 그것은

protected void processOperator(Operator operator, List<COSBase> operands) throws IOException { 
     String operation = operator.getName(); 

     if ("Do".equals(operation)) { 
      COSName objectName = (COSName) operands.get(0); 
      PDXObject xobject = getResources().getXObject(objectName); 

      if (xobject instanceof PDImageXObject) { 
       PDImageXObject image = (PDImageXObject) xobject; 

       Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix(); 
       float imageXScale = ctmNew.getScalingFactorX(); 
       float imageYScale = ctmNew.getScalingFactorY(); 

       int rotationDegree = getCurrentPage().getRotation(); 

       float pageHeight = this.getCurrentPage().getBBox().getHeight(); 
       float pageWidth = this.getCurrentPage().getBBox().getWidth(); 
       float translateX; 
       float translateY; 

       if (rotationDegree == 0) { 
        translateX = ctmNew.getTranslateX(); 
        translateY = pageHeight - ctmNew.getTranslateY() - imageYScale; 
       } else if (rotationDegree == 90) { 
        translateX = ctmNew.getTranslateY(); 
        translateY = ctmNew.getTranslateX() - imageYScale; 
       } else if (rotationDegree == 270) { 
        translateX = pageHeight - ctmNew.getTranslateY(); 
        translateY = pageWidth - ctmNew.getTranslateX() - imageYScale; 
       } else if (rotationDegree == 180) { 
        translateX=pageWidth - ctmNew.getTranslateX() -imageXScale ; 
        translateY=pageHeight - ctmNew.getTranslateY() - imageYScale; 
        logger.log(Level.INFO, "image rotation 180 degree. not fully tested yet"); 
       } 
       else { 
        throw new RuntimeException(""); 
       } 

       PdfImage pdfImage = new PdfImage(objectName.getName(), translateX, translateY, imageXScale, imageYScale, image.getImage()); 
       pdfImages.add(pdfImage); 

      } else if (xobject instanceof PDFormXObject) { 
       PDFormXObject form = (PDFormXObject) xobject; 
       showForm(form); 
      } 
     } else { 
      super.processOperator(operator, operands); 
     } 
} 
관련 문제