使用绝对定位将对象放到pdf页面上时(在我猜测的PdfContentByte
内?),它位于从左下角开始的坐标系中。
我想以系统从左上角开始的方式翻转坐标。我会在向页面添加任何内容之前进行翻转。
我尝试使用此
cb.concatCTM(1f, 0f, 0f, -1f, 0f, PageSize.A4.getHeight());
但后来添加的对象被翻转(我不想发生的事情)。
答案 0 :(得分:3)
您应用于PDF坐标系的任何转换不仅会改变您 可以提供页面某些点的坐标的方式;相反,它也会改变 PDF查看器绘制其对象的坐标系。 E.g。
(第{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;
也许您也必须考虑添加/操作对象的尺寸。 我在应用程序中添加了矩形。