如何在iText中翻转坐标系?

时间:2013-08-06 20:39:33

标签: java itext

使用绝对定位将对象放到pdf页面上时(在我猜测的PdfContentByte内?),它位于从左下角开始的坐标系中。

我想以系统从左上角开始的方式翻转坐标。我会在向页面添加任何内容之前进行翻转。

我尝试使用此

cb.concatCTM(1f, 0f, 0f, -1f, 0f, PageSize.A4.getHeight());

但后来添加的对象被翻转(我不想发生的事情)。

4 个答案:

答案 0 :(得分:3)

您应用于PDF坐标系的任何转换不仅会改变 可以提供页面某些点的坐标的方式;相反,它也会改变 PDF查看器绘制其对象的坐标系。 E.g。

Figure 13 - Effects of Coordinate Transformations

  

(第{8.3.2节 中的常见转换

如果 翻转 坐标系统从左上角开始,那么,您还翻转< / strong>绘制的对象。如果是文本对象,您可以通过文本矩阵在原位翻转来本地撤消翻转。

但是,这意味着非常麻烦。如果它足以让原点位于页面左上角的负y坐标,我建议你只需翻译坐标系。

答案 1 :(得分:2)

如果您需要坐标系的原点位于左上角,则可以使用简单的数学运算来更改坐标。为此目的使用不同的CTM更复杂,并且可能导致各种副作用,正如您自己经历的那样。例如:旋转CTM也会旋转内容(文本可以颠倒,镜像,......)。

为什么不简单地使用重新计算坐标的方法。例如:您希望从页面顶部开始计算坐标(10,10),然后使用transform(pagesize,y),其中transform方法的定义如下:

public float transform(Rectangle pagesize, float y) {
    return pagesize.top() - y;
}

通过这种方式,您可以执行以下操作:

float x = 50;
float y = transform(pagesize, 50);
table.writeSelectedRows(0, 10, x, y, canvas);

就我个人而言,我认为不尊重ISO-32000-1中定义的坐标系是一个坏主意,因为您更喜欢使用奇数坐标系统,其中增加的Y值指向下而不是向上(这是非常直观的) ),但如果你坚持这样做,你不应该篡改CTM,除非你的PDF文件真的很大。

答案 2 :(得分:0)

首先:原谅我的英语。我是西班牙人xD

这是我的解决方案:

我一直在找同样的事情。我想在左上角有原点。

嗯,你不能改变它,但你可以做另一件事。

如果你想要每个页面的高度,你必须从PdfReader类中获取页面的cropbox。

所以,例如,如果你想得到垂直位置&#34; y = 60&#34;考虑到左上角的起源,你必须这样做:

PdfReader reader = new PdfReader("yourFile.pdf");
Float y = reader.getCropBox(pageNumber).getHeight()-60;  

如果您的pdf文档具有不同的页面高度,这非常有用。

答案 3 :(得分:0)

此解决方案对我的应用程序有帮助:

PdfReader reader = new PdfReader("yourFile.pdf");
Float y = reader.GetPageSize(pageIndex).Height-60; 
Float y = reader.GetPageSize(pageIndex).Height-60-rectangleHeight;

也许您也必须考虑添加/操作对象的尺寸。 我在应用程序中添加了矩形。