当前位置: 首页 > 面试题库 >

在PDFBox中,如何更改PDRectangle对象的原点(0,0)点?

权黎昕
2023-03-14
问题内容

情况:
在PDFBox中,PDRectangle对象的默认原点(0,0)似乎是页面的左下角。

例如,以下代码在页面的左下角为您提供一个正方形,并且每边长100个单位。

PDRectangle rectangle = new PDRectangle(0, 0, 100, 100);

问题:
是否可以将原点更改为UPPER-LEFT角,例如,上面的代码将在页面的UPPER-LEFT角处为您提供相同的正方形?

我问的原因:
我正在使用PDFTextStripper获取文本的坐标(通过使用提取的TextPosition对象的getX()和getY()方法)。从TextPosition对象检索的坐标似乎在UPPER-
LEFT CORNER处具有原点(0,0)。我希望我的PDRectangle对象的坐标与TextPosition对象的坐标具有相同的原点。

我试图通过“页面高度减去Y坐标”来调整PDRectangle的Y坐标。这给了我想要的结果,但是并不优雅。我想要一个优雅的解决方案。


问题答案:

您可以稍微更改坐标系,但是最有可能的事情最终不会变得更加优雅。

首先,让我们清除一些误解:

你假设

在PDFBox中,PDRectangle对象的默认原点(0,0)似乎是页面的左下角。

并非所有情况都是如此,只是经常如此。

包含显示的页面区域(在纸上或在屏幕上)的区域通常由相关页面的 CropBox 条目定义:

CropBox 矩形 (可选;可继承)
以默认用户空间单位表示的矩形,它将定义默认用户空间的可见区域。在显示或打印页面时,应将其内容剪切(裁剪)到该矩形,然后以某种实现定义的方式强加到输出介质上。

…按照标准数学惯例,正x轴水平向右延伸,正y轴垂直向上延伸(可通过页面词典中的“ 旋转” 条目进行更改)。

…在PostScript中,默认用户空间的原点始终与输出介质的左下角相对应。尽管此约定在PDF文档中也很常见,但不是必需的;页面字典的
CropBox 条目可以指定默认用户空间的任何矩形,以使其在介质上可见。

因此, 原点(0,0)可以在任何地方 ,它可以在页面的左下角,左上角,中间的页面中,甚至可以远远超出显示的页面区域。

通过“ 旋转”(Rotate) 入口, 该区域甚至可以旋转 旋转 90°,180°或270°)。

按照惯例,将原点(如您所观察到的)放在左下角即可。

此外,您似乎认为坐标系是恒定的。事实并非如此,有些操作可以用来彻底转换用户空间坐标系,还可以对其进行平移,旋转,镜像,倾斜和/或缩放!

因此,即使开始时坐标系是通常的坐标系,原点在左下,x轴在右,y轴在上,它也可能以某种奇怪的方式更改为页面内容描述。在new PDRectangle(0, 0, 100, 100)此处绘制矩形可能会在页面中心的右侧生成一些菱形形状。

你可以做什么…

如您所见,PDF用户空间中的坐标是一个非常动态的问题。如何处理这种情况,取决于您使用矩形的上下文。

不幸的是,您对所做工作的描述非常含糊。因此,这也将有些模糊。

页面内容中的坐标

如果要在现有页面上绘制一些矩形,则首先需要页面内容流(即PDPageContentStream实例)进行写入,并且应以确保不干扰原始用户空间坐标系的方式进行准备。您可以通过将构造函数与三个布尔参数一起使用来获得这样的实例true

PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true);

然后,您可以将变换应用于坐标系。您希望左上角是原点,并且y值向下增加。如果页面的裁剪框告诉您左上角有坐标(xtl,ytl),则您应用

contentStream.concatenate2CTM(new AffineTransform(1, 0, 0, -1, xtl, ytl));

从这里开始,您便有了所需的坐标系,原点位于左上方,y坐标已镜像。

但是,请注意一件事:如果还要绘制文本,则不仅要镜像文本插入点y坐标,还要镜像文本本身,除非通过添加也镜像文本矩阵来抵消它!因此,如果您想添加很多文本,则可能不够理想。

注释坐标

如果您不想在内容流中使用矩形,而是想添加注释,则不必进行上述转换,但是也不能使用它。

因此,在这种情况下,您必须直接使用裁剪框并相应地变换矩形。

为什么PDFBox文本提取坐标保持原样

本质上是为了以正确的顺序将文本行放在一起并正确地对行进行排序,您不希望出现这种奇怪的情况,而是想要一个简单的稳定坐标系。一些PDFBox开发人员为此选择了最左上角,y-递增-
向下变体,因此TextPosition坐标已被标准化为该方案。

我认为,更好的选择是使用默认的用户空间坐标,以便更轻松地重用坐标。你可能会,因此,想尝试一起工作textPosition.getTextMatrix().getTranslateX()textPosition.getTextMatrix().getTranslateY()TextPosition textPosition



 类似资料:
  • 情况: 在PDFBox中,PDRectangle对象的默认原点(0,0)似乎是页面的左下角。 例如,下面的代码在页面的左下角为您提供一个正方形,每边长度为100个单位。 问题: 是否可以将原点更改为左上角,这样,例如,上面的代码将在页面的左上角给出相同的正方形?

  • 问题内容: 如图所示,该图是从y = 0行开始的,这里我想从 y = 50开始绘制一个图,如何在JFreeChart?中指定呢? 这是一些代码: 问题答案: 您可以使用 ValueAxis类的setLowerBound()方法指定Y轴的底部值。 使用您的示例:

  • 默认情况下,qPaint的原点位于左上角。我想画形状,但我所有的坐标都是笛卡尔坐标系。那么我的问题是,如何将原点更改为左下角?当然,我可以缩放(1,-1),但也可以缩放并打印反转文本。我所需要的只是移动原点。

  • 我试图得到4个Vector2对象,它们代表一个精灵的4个角,在精灵自身围绕其中心旋转时旋转。但是,在下面的代码中,Vector2对象在客户端空间中围绕0,0旋转,而不是围绕对象的中心旋转。使用矩阵变换,是否有任何方法可以围绕对象的中心而不是全局坐标(0,0)旋转Vector2对象? 这是迄今为止旋转的函数:

  • 我有一个有三个字段的表单,HandleChange方法在第一个字段(DateOfBirth)中工作,但在(Id1)和(Id2)字段中不工作。 由于某些原因,当我尝试更改(Id1 | | Id2)字段的值时,setState返回此错误。 “组件正在将文本类型的受控输入更改为非受控。输入元素不应从受控切换为非受控(反之亦然)。在组件的使用寿命内,决定使用受控还是非受控输入元素”

  • 本文向大家介绍JavaScript更改原始对象valueOf的方法,包括了JavaScript更改原始对象valueOf的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript更改原始对象valueOf的方法。分享给大家供大家参考。具体分析如下: JS中的对象都包含valueOf方法,我们可以通过自定义valueOf函数替换掉原始object的valueOf 希望本文所述