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

情况:

在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)似乎是页面的左下角。

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

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

矩形 (可选;可继承)

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

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

…在PostScript中,默认用户空间的原点始终与输出介质的左下角相对应。尽管此约定在PDF文档中也很常见,但不是必需的;页面字典的

条目可以指定默认用户空间的任何矩形,以使其在介质上可见。

因此, ,它可以在页面的左下角,左上角,中间的页面中,甚至可以远远超出显示的页面区域。

通过“ 入口, ( 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)点? 的全部内容, 来源链接: utcz.com/qa/422592.html

回到顶部