我是PDFBox(和PDF生成)的新手,我很难生成自己的PDF。
我的文字有一些以英寸/厘米为单位的坐标,我需要将它们转换为PDFBox使用的单位。任何建议/实用程序都可以自动执行此操作?
PDPageContentStream.moveTextPositionByAmount(x,y)
对我毫无意义。
答案 0 :(得分:29)
通常,PDFBox在创建PDF时使用PDF用户空间坐标。这意味着:
页面的坐标由 CropBox 默认为 MediaBox 分隔,值从左到右,从下到上增加。因此,如果您使用new PDPage()
或new PDPage(PDPage.PAGE_SIZE_*)
创建页面,则坐标系的原点将从页面的左下角开始。
用户空间中的单位以默认用户空间单位开始,该单位由页面的 UserUnit 定义。大多数情况下(例如,如果您使用任何PDPage
构造函数创建页面并且未明确更改该值),则不会显式设置它,因此,其默认踢法为1/72英寸。
用户空间坐标系可以通过连接任意改变 一些矩阵到当前的变换矩阵。当前变换矩阵以单位矩阵开始。
在PDFBox中,您可以使用PDPageContentStream.concatenate2CTM()
重载之一。
只要使用PDPageContentStream.beginText()
切换到文本模式,所使用的坐标系统就会受到文本矩阵引入的变换的影响。
在PDFBox中,您可以使用PDPageContentStream.setTextMatrix()
重载之一设置文本矩阵。
由于你是PDFBox的新手(如你所说)和一般的新手(因为我认为因为你可能已经识别了坐标),我建议你最初不要在任何可能的地方使用转换,因此,保持在坐标系从左下角开始的状态,既不旋转也不倾斜,单位长度为1/72英寸。
对于此上下文,您实际上可以使用PDFBox提供的常量进行转换:
PDPage.DEFAULT_USER_SPACE_UNIT_DPI
乘以英寸坐标以获取默认用户空间坐标。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;