19

我是 PDFBox(和 PDF 生成)的新手,我在生成自己的 PDF 时遇到了困难。

我确实有以英寸/厘米为单位的特定坐标的文本,我需要将它们转换为 PDFBox 使用的单位。任何可以自动执行此操作的建议/实用程序?

PDPageContentStream.moveTextPositionByAmount(x,y)对我来说毫无意义。

4

1 回答 1

36

通常 PDFBox 在创建 PDF 时使用 PDF 用户空间坐标。这表示:

  1. 页面的坐标由默认为其MediaBox的CropBox分隔,值从左到右从下到上递增。因此,如果您使用或坐标系的原点从页面的左下角开始创建页面。new PDPage()new PDPage(PDPage.PAGE_SIZE_*)

  2. 用户空间中的单元作为默认用户空间单元开始,该单元由页面的UserUnit定义。大多数情况下(例如,如果您使用任何构造函数创建页面PDPage并且没有显式更改该值)它没有显式设置,因此,它的默认值是 1⁄72 英寸。

  3. 用户空间坐标系可以通过将一些矩阵连接到当前变换矩阵来任意改变。当前的变换矩阵以单位矩阵开始。

    在 PDFBox 中,您可以使用其中一种PDPageContentStream.concatenate2CTM()重载来执行此操作。

  4. 使用 切换到文本模式后,所使用PDPageContentStream.beginText()的坐标系还会受到文本矩阵引入的变换的影响。

    在 PDFBox 中,您使用PDPageContentStream.setTextMatrix()重载之一设置文本矩阵。

由于您是 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),最终在转换到 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 回答