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; |
- PDPage 上似乎没有定义 MM_TO_UNITS 或 DEFAULT_USER_SPACE_UNIT_DPI。
-
@Thyne 您使用的是哪个版本的 PDFBox?我在 1.8.4 和当前的 2.0.0 中都看到了常量。
-
我使用的是 1.8.5。我不知道有一个 2.0.0
-
查看源代码,这些常量已定义但是私有的
-
啊,对了,能见度变了。他们曾经是公开的
-
假设单位是点,它们通常是:mm = pt * 0.352778 和 pt = mm / 0.352778
-
@mlk 我正在尝试使用 pdfbox 创建 PDF 文件。当我开始添加文本和图像时,就像你说的那样,它开始将它们添加到文档的底部(左下角)。如何开始在顶部添加所有内容?
-
@Erich 这实际上是一个全新的问题,不应在评论中处理。话虽如此,您必须首先使用裁剪框或媒体框坐标和大小作为指导来移动文本位置。
-
@Erick当我开始添加文本和图像时,就像你说的那样,它开始将它们添加到文档的底部(左下角)。如何开始在顶部添加所有内容? - 您可能想查看这个答案,它说明了如何在给定页面上的多行中绘制一些文本。 (在那个答案中,我也使用了媒体框;您可能想用裁剪框替换它。)
-
@mkl 我最近开始使用 PDFBox 通过 org.apache.pdfbox.text.PDFTextStripperByArea 从区域中提取文本。在这种情况下,我发现 addRegion( String, Rectangle) 需要使用从页面左上角开始的坐标来定义矩形坐标。不确定这是否是特例,但也许值得一提。
-
@beldaz 是的,pdfbox 文本提取代码使用自己的坐标系。如果您的任务不是纯文本提取,而是需要检索到的坐标用于不同的任务,例如突出显示 pdf 中找到的一些单词,这可能会让您的生活变得困难。对于所有其他任务,您需要原始 PDF 用户空间坐标系。这通常起源于左下角。
-
从 2.0.4(或更早版本,这就是我正在使用的)开始,在 PDPage 中找不到 DEFAULT_USER_SPACE_UNIT_DPI 和 MM_TO_UNITS。 DEFAULT_USER_SPACE_UNIT_DPI 值为 72(每英寸像素)。