web-dev-qa-db-ja.com

インチまたはセンチメートルを座標系に変換するPDFBox

私はPDFBoxを初めて使用し(そしてPDF生成)、自分のPDFを生成するのに苦労しています。

インチ/センチメートル単位の特定の座標を持つテキストがあり、PDFBoxが使用する単位に変換する必要があります。これを自動的に行うことができるよりも提案/ユーティリティはありますか?

PDPageContentStream.moveTextPositionByAmount(x,y)は私には意味がありません。

18
Robby F

一般に、PDFBoxはPDFを作成するときにPDFユーザースペース座標を使用します。これは、次のことを意味します。

  1. ページの座標は、CropBoxで区切られ、デフォルトではMediaBoxになります。 、値は左から右、下から上に増加します。したがって、new PDPage()またはnew PDPage(PDPage.PAGE_SIZE_*)を使用してページを作成すると、座標系の原点はページの左下隅から始まります。

  2. ユーザースペースの単位は、UserUnitによって定義されるデフォルトのユーザースペース単位として始まります。ページ。ほとんどの場合(たとえば、PDPageコンストラクターのいずれかを使用してページを作成し、その値を明示的に変更しない場合)、明示的に設定されていないため、デフォルトのキックは1⁄72インチです。

  3. ユーザー空間の座標系は、いくつかの行列を現在の変換行列に連結することにより、かなり任意に変更できます。現在の変換行列は、単位行列として始まります。

    PDFBoxでは、PDPageContentStream.concatenate2CTM()オーバーロードの1つを使用してこれを行います。

  4. PDPageContentStream.beginText()を使用してテキストモードに切り替えるとすぐに、使用される座標系は、テキストマトリックスによって導入された変換の影響をさらに受けます。

    PDFBoxでは、PDPageContentStream.setTextMatrix()オーバーロードの1つを使用してテキストマトリックスを設定します。

あなたはPDFBox(あなたが言うように)とPDF一般的に(そうでなければあなたはおそらく座標を認識していると思うので)に慣れていないので)最初は使用を控えることをお勧めします可能な限り変換するため、座標系は左下から始まり、回転も傾斜もせず、単位長は1/72インチ

このコンテキストでは、実際に変換にPDFBoxが提供する定数を使用できます。

  • インチ単位の座標にPDPage.DEFAULT_USER_SPACE_UNIT_DPIを掛けて、デフォルトのユーザー空間座標を取得します。
  • Mm単位の座標にPDPage.MM_TO_UNITSを掛けて、デフォルトのユーザー空間座標を取得します。

ただし、座標を楽しみたい場合は、PDF仕様 ISO-32000-1 )を見て、セクション8.3座標を調べてください。システムおよび9.4.4テキストスペースの詳細


上記のPDPage定数は、初期のPDFBox 1.8.xバージョンではアクセス可能でしたが、その後非表示になり(private)、最終的にPDFBox2.xへの移行で削除されました。

参考までに、定数は次のように定義されました。

private static final int DEFAULT_USER_SPACE_UNIT_DPI = 72;

private static final float MM_TO_UNITS = 1/(10*2.54f)*DEFAULT_USER_SPACE_UNIT_DPI;
34
mkl