您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

你假设

在PDF@R_678_2419@中,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坐标,还要镜像文本本身,除非通过添加也镜像文本矩阵来抵消它!因此,如果您想添加很多文本,则可能不够理想。

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

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

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

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

其他 2022/1/1 18:14:20 有647人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶