19

私は PDFBox (および PDF 生成) が初めてで、独自の PDF を生成するのに苦労しています。

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

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

4

1 に答える 1

36

一般に、PDFBox は PDF の作成時に PDF ユーザー空間座標を使用します。これの意味は:

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

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

  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 Coordinate Systemsおよび 9.4.4 Text Space Detailsを調べてください。


上記のPDPage定数は、初期の PDFBox 1.8.x バージョンではアクセス可能でしたが、その後非表示になり ( private)、最終的に PDFBox 2.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;
于 2014-02-03T09:15:51.180 に答える