Java iText旋转链接矩形

时间:2015-03-27 14:39:59

标签: java hyperlink itext

我需要使用Java iText旋转链接矩形。

原始链接矩形显示为红色。旋转的链接矩形显示为绿色。

我的代码:

PdfReader reader = new PdfReader( "input/blank.pdf" );
PdfStamper stamper = new PdfStamper( reader, new FileOutputStream(  "output/blank_stamped.pdf" ) );
Rectangle linkLocation = new Rectangle( 100, 700, 100 + 200, 700 + 25 );
PdfName highlight = PdfAnnotation.HIGHLIGHT_INVERT;
PdfAnnotation linkRed  = PdfAnnotation.createLink( stamper.getWriter(), linkLocation, highlight, "red" );
PdfAnnotation linkGreen = PdfAnnotation.createLink( stamper.getWriter(), linkLocation, highlight, "green" );
BaseColor baseColorRed = new BaseColor(255,0,0);
BaseColor baseColorGreen = new BaseColor(0,255,0);
linkRed.setColor(baseColorRed);
linkGreen.setColor(baseColorGreen);
double angleDegrees = 10;
double angleRadians = Math.PI*angleDegrees/180;
stamper.addAnnotation(linkRed, 1);
linkGreen.applyCTM(AffineTransform.getRotateInstance(angleRadians));
stamper.addAnnotation(linkGreen, 1);
stamper.close();

但是这段代码不会旋转重复。

1 个答案:

答案 0 :(得分:0)

请看下面的截图:

enter image description here

我在简单的Hello World文件中添加了5个注释。

前两个是链接注释。它们的位置由矩形linkLocation1linkLocation2

定义
Rectangle linkLocation1 = new Rectangle(30, 770, 120, 800);
PdfAnnotation link1 = PdfAnnotation.createLink(stamper.getWriter(),
        linkLocation1, PdfAnnotation.HIGHLIGHT_INVERT, action);
link1.setColor(BaseColor.RED);
stamper.addAnnotation(link1, 1);
Rectangle linkLocation2 = new Rectangle(30, 670, 60, 760);
PdfAnnotation link2 = PdfAnnotation.createLink(stamper.getWriter(),
        linkLocation2, PdfAnnotation.HIGHLIGHT_INVERT, action);
 link2.setColor(BaseColor.GREEN);
 stamper.addAnnotation(link2, 1);

绿色矩形看起来像红色矩形的旋转版本,但事实并非如此:我们只是通过这种方式定义了“可点击”区域。我不明白为什么你想通过引入旋转来获得这种效果。为什么?因为旋转总是需要旋转点。假设你要引入一个旋转,你的旋转点是什么? (0, 0)坐标?这会导致奇怪的结果,不是吗?

引入旋转对于某些类型的注释确实有意义。在我的例子中,我介绍了三个图章注释:

Rectangle linkLocation3 = new Rectangle(150, 770, 240, 800);
PdfAnnotation stamp1 = PdfAnnotation.createStamp(stamper.getWriter(), linkLocation3, "Landscape", "Confidential");
stamper.addAnnotation(stamp1, 1);
Rectangle linkLocation4 = new Rectangle(150, 670, 240, 760);
PdfAnnotation stamp2 = PdfAnnotation.createStamp(stamper.getWriter(), linkLocation4, "Portrait", "Confidential");
stamp2.setRotate(90);
stamper.addAnnotation(stamp2, 1);
Rectangle linkLocation5 = new Rectangle(250, 670, 340, 760);
PdfAnnotation stamp3 = PdfAnnotation.createStamp(stamper.getWriter(), linkLocation5, "Portrait", "Confidential");
stamp3.setRotate(45);
stamper.addAnnotation(stamp3, 1);

在这种情况下,我使用setRotate()方法引入旋转角度。这会在我们定义的矩形内旋转 CONFIDENTIAL 标记。正如您所看到的,这是有道理的,因为注释确实具有实际内容:轮换会影响您阅读单词机密的方式。在链接注释的可点击区域的情况下,没有这样的内容可以旋转。

如果这不能解答您的问题,请重新提出您的问题,因为我认为任何人都无法在当前状态下回答。

<强>更新 请查看ISO-32000-1,即PDF规范。您将发现使用4个值定义矩形:矩形左下角的x和y坐标以及矩形右上角的x和y坐标。这是水平垂直两个方面的两个起点。您需要一个边长不是水平/垂直的矩形。显然这是不可能的,因为你需要4个角点的坐标来实现它(8个值,而不是4个)。您可以使用QuadPoints定义的多边形来实现此目的。 见ITextShape Clickable Polygon or path