0

質問:

ある座標形式を別の形式で動作させることができないようです。私は正しいマトリックスを使用していないだけだと思いますが、それらについて確実に知るには十分ではありません。私は自分の変換がどうあるべきかを仮定しているかどうかを理解する助けを得たいと思っていました.

iText は ISO 標準に従って左下を原点として使用しますが、pdfbox コードと、pdf からスクレイピングする座標を提供するプログラムは両方とも左上を原点として使用します。

iTextが機能する方法でそれらを消費できるように、座標を適応させるためにどのような変換を行う必要がありますか?

バックグラウンド

pdfbox を使用して pdf を操作し、一部のデータを削除するコードがいくつかあるので、変更したデータをページに挿入する必要があります。PDFBox のライターは PDF を破損し続けるため、iText を使用してインジェクションを行うことにしました。

トリックは、私がpdfboxで使用した座標(およびpdfを生成するシステムから取得した座標)がiTextのものと一致しないように見えることです。

これまでに行ったこと

私がチェックしたところ、iTextページとクロップボックスの両方が正確であるようです:

  PdfReader splitPDFDocumentReader = new PdfReader(splitPDFdocumentName);

  com.lowagie.text.Rectangle theCropBox = splitPDFDocumentReader.getCropBox(1);
  com.lowagie.text.Rectangle thePageSize = splitPDFDocumentReader.getPageSize(1);

  consolePrintln("Cropbox: " + theCropBox.toString());
  consolePrintln("\tBottom " + theCropBox.getBottom());
  consolePrintln("\tLeft " + theCropBox.getLeft());
  consolePrintln("\tTop " + theCropBox.getTop());
  consolePrintln("\tRight " + theCropBox.getRight());

  consolePrintln("PageSize: " + thePageSize.toString());
  consolePrintln("\tBottom " + thePageSize.getBottom());
  consolePrintln("\tLeft " + thePageSize.getLeft());
  consolePrintln("\tTop " + thePageSize.getTop());
  consolePrintln("\tRight " + thePageSize.getRight());

出力:

Cropbox: Rectangle: 612.0x792.0 (rot: 0 degrees)
    Bottom 0.0
    Left 0.0
    Top 792.0
    Right 612.0
PageSize: Rectangle: 612.0x792.0 (rot: 0 degrees)
    Bottom 0.0
    Left 0.0
    Top 792.0
    Right 612.0

pdfboxの原点は左上にあり、iTextsは左下にあるため、y座標を反転させるだけの問題だと思います。

困ったところ

変換を適用すると:

  //  matrix data example:
  //  [m00, m01, m02,
  //   m10, m11, m12,
  //   0  , 0  , 1   ]  // this bit is implied as part of affineTransform docs
  content.saveState();
  int m00 = 1;
  int m01 = 0;
  int m02 = 0;
  int m10 = 0;
  int m11 = -1;
  int m12 = 0;

  content.concatCTM(m00, m10, m01, m11, m02, m12);

  content.setColorStroke(Color.RED);
  content.setColorFill(Color.white);
  content.rectangle(x, y, x + height, y + width);
  content.fillStroke();

  content.restoreState();

私が期待することをしていないようです。データは完全にページの外にあるようです。

その他の注意事項

正直なところ、私はマトリックスがあまり得意ではありません。おそらく、私がやろうとしたように y を単に失敗させるだけでなく、翻訳作業を行う必要がありますか?

concatCTM 関数はawt.geom.affinetransformと同じ形式をとっているようです。変換を使用するためのこの例チュートリアルに従っています。

4

1 に答える 1