关于单位转换:PDFBox将英寸或厘米转换为坐标系

PDFBox converting inches or centimeters into the coordinate system

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

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

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


一般情况下,PDFBox 在创建 PDF 时使用 PDF 用户空间坐标。这意味着:

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

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

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

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

  • 一旦使用 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 时被删除。

    作为参考,常量被定义为

    1
    2
    3
    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;