PDFBox将英寸或厘米转换为坐标系

时间:2014-02-03 05:01:55

标签: pdfbox unit-conversion

我是PDFBox(和PDF生成)的新手,我很难生成自己的PDF。

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

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

1 个答案:

答案 0 :(得分:29)

通常,PDFBox在创建PDF时使用PDF用户空间坐标。这意味着:

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

  2. 用户空间中的单位以默认用户空间单位开始,该单位由页面的 UserUnit 定义。大多数情况下(例如,如果您使用任何PDPage构造函数创建页面并且未明确更改该值),则不会显式设置它,因此,其默认踢法为1/72英寸。

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

    在PDFBox中,您可以使用PDPageContentStream.concatenate2CTM()重载之一。

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

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

  5. 由于你是PDFBox的新手(如你所说)和一般的新手(因为我认为因为你可能已经识别了坐标),我建议你最初不要在任何可能的地方使用转换,因此,保持在坐标系从左下角开始的状态,既不旋转也不倾斜,单位长度为1/72英寸。

    对于此上下文,您实际上可以使用PDFBox提供的常量进行转换:

    • PDPage.DEFAULT_USER_SPACE_UNIT_DPI乘以英寸坐标以获取默认用户空间坐标。
    • 以mm PDPage.MM_TO_UNITS乘以mm坐标以获取默认用户空间坐标。

    如果您想获得坐标的乐趣,请查看PDF规范ISO-32000-1并研究8.3 坐标系和9.4.4 文本空间详细信息


    上面指出的PDPage常量曾经可以在早期的PDFBox 1.8.x版本中访问,但随后被隐藏(private),并最终在转换为PDFBox 2.x时被删除。 / p>

    作为参考,常量定义为

    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;