当前位置: 首页 > 知识库问答 >
问题:

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

樊杰
2023-03-14

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

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

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

问题:
是否可以将原点更改为左上角,这样,例如,上面的代码将在页面的左上角给出相同的正方形?

共有1个答案

仲孙夕
2023-03-14

把原点(你似乎已经观察到了)放在左下方只是按惯例做的。

此外,你似乎认为坐标系是常数。这也不是情况,有一些操作,您可以转换用户空间坐标系剧烈,您可以平移,旋转,镜像,歪斜,和/或缩放它!

因此,即使在一开始的坐标系是通常的坐标系,原点在左下,X轴向右,Y轴向上,它也可能在页面内容描述中以某种方式被改变成某种奇怪的东西。绘制您的矩形新建PDRectangle(0,0,100,100)可能会在页面中心的右侧生成一些菱形形式。

正如您所看到的,PDF用户空间中的坐标是一个非常动态的问题。您可以做什么来控制这种情况,这取决于您在其中使用矩形的上下文。

不幸的是,你对你所做的描述相当含糊。因此,这也会有些模糊。

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

然后您可以对坐标系应用一个转换。您希望左上角是原点,Y值向下增加。如果页面的裁剪框告诉您左上方有坐标(xtl,ytl),因此,您应用

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

从这里开始,你就有了一个你想要的坐标系,原点左上方和y坐标镜像。

不过,请注意一点:如果你也要绘制文本,那么不仅文本插入点y坐标是镜像的,而且文本本身也是镜像的,除非你html" target="_blank">添加一个镜像文本矩阵来抵消它!如果你想添加很多文本,因此,这可能没有你想要的那么优雅。

本质上是为了将文本行按正确的顺序放在一起并正确地排序,您不想要这样一个奇怪的情况,而是一个简单稳定的坐标系。一些PDFBox开发人员为此选择了左上角原点、Y向下递增的变体,因此textPosition坐标已经归一化为该方案。

在我看来,更好的选择应该是使用默认的用户空间坐标,以便于坐标的重用。因此,您可能希望尝试使用TextPosition.GetTextMatrix().GetTranslateX()TextPosition.GetTextMatrix().GetTranslatey()来处理TextPosition

 类似资料:
  • 问题内容: 情况: 在PDFBox中,PDRectangle对象的默认原点(0,0)似乎是页面的左下角。 例如,以下代码在页面的左下角为您提供一个正方形,并且每边长100个单位。 问题: 是否可以将原点更改为UPPER-LEFT角,例如,上面的代码将在页面的UPPER-LEFT角处为您提供相同的正方形? 我问的原因: 我正在使用PDFTextStripper获取文本的坐标(通过使用提取的TextP

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

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

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

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

  • 我的课程注册项目应该有很多方法,比如(添加课程),(添加导师),等等(添加学生())就是其中之一,我想知道每次创建对象时如何更改对象的变量(std)我不知道每个对象如何都有相同的变量 那么,我想把变量改为std1、std2之类的任何建议 我想知道这是不是我做错了什么? 如果每个对象都用相同的变量声明,那么它会将每个创建的对象的数据克隆到新创建的对象? 谢谢你。