AffineTransform at = new AffineTransform(w, 0, 0, h, 20, 20);
at.translate(0.5, 1);
at.rotate(Math.toRadians(90));
宽度和高度必须很小才能使图片保持在页面上,自身旋转会压缩图片,而在旋转之前进行平移似乎会将图片缩放得很大。
这是一个 bug 吗,还是我没有理解 PDFBox?
这不是 bug,只是数学问题。你需要明白,如果你有一个 AffineTransform at
,然后调用 at.translate(...)
或 at.rotate(...)
,你并没有将仿射变换的平移/旋转部分设置为给定值,而是用以前的变换和平移/旋转组合来替换你的变换。
这意味着例如:
AffineTransform at = new AffineTransform(w, 0, 0, h, 20, 20);
at.translate(0.5, 1);
不等于(not the same as)
AffineTransform at = new AffineTransform(w, 0, 0, h, 20.5, 21);
正如你所预料的那样,但
相反。
AffineTransform at = new AffineTransform(w, 0, 0, h, 20 + w/2, 20 + h);
这就是为什么
宽度和高度必须很小才能保持图像在页面上 - 否则
translate(0.5, 1)
会推得非常远。
由于组合变换的顺序很重要,如果按照以下顺序创建变换,您可能会更满意:
AffineTransform at = AffineTransform.getTranslateInstance(0.5, 1);
at.rotate(Math.toRadians(90));
af.concatenate(new AffineTransform(w, 0, 0, h, 20, 20));
PS:正如Tilman所说:请记住旋转是以左下角为中心,因此这个组合也会旋转到屏幕外。只需将初始平移的x坐标加上h+20
即可。