2016-12-29 72 views
1

PDFを画像としてレンダリングし、そこに含まれるすべての画像の罫線を描画します。このためには、ページ上のイメージの正しい寸法が必要です。pdfboxで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を返すpdfがたくさんあります。 90度の場合、正しい位置を取得するためにgetTranslateXとgetTranslateYの値を切り替える必要がありますが、これは特別に90度でしか動作しません。私は位置を回転させるために使用できるクールなマトリックス情報がありますか?

私はthisコードで、この回転の問題を解決しようとしましたが、第1回はどのような変換が行われているのか分かりません。

答えて

0

ローテーション

次のローテーション行列を使用して、ユークリッド空間でローテーションを実行できます。

反時計回り:

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

時計回り:

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

各マトリックス原点約θの角度を介して2次元デカルト平面内の点を回転します。この手法では、各点が列ベクトルvで表されると仮定しています。各点の新しい値はR * vで計算されます。*は行列乗算を表します。


「負」の値

この技術は、二次元の少なく​​とも一方に、少なくともいくつかの点について負の値(いずれにしても初期値に相対を)生成します。これをデカルト起点に対して相対的に補正するには、回転イメージをmin(y) - min(y')で ""を右に変換します。ここで、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); 
     } 
} 
関連する問題