Java 如何检索PDFSTAMP注释旋转

Java 如何检索PDFSTAMP注释旋转,java,itext,itext7,Java,Itext,Itext7,参考,如何检索戳记批注的旋转 我创建了一个文档,放置了一个stamp1,翻页并添加了另一个stamp2。 文档正常(stamp1图像旋转,stamp2未旋转),但提取的图像完全相同(方向相同) 我可以用它来实现页面旋转 page.getRotation() // 90 如果我想得到邮票(图像)的方向 // I expect to get 0 but get 90 stamp1.getPdfObject().getAsDictionary(PdfName.P).get(PdfName.Rota

参考,如何检索戳记批注的旋转

我创建了一个文档,放置了一个stamp1,翻页并添加了另一个stamp2。 文档正常(stamp1图像旋转,stamp2未旋转),但提取的图像完全相同(方向相同)

我可以用它来实现页面旋转

page.getRotation()  // 90
如果我想得到邮票(图像)的方向

// I expect to get 0 but get 90
stamp1.getPdfObject().getAsDictionary(PdfName.P).get(PdfName.Rotate)

// I get 90
stamp2.getPdfObject().getAsDictionary(PdfName.P).get(PdfName.Rotate)
我花了几个小时来争取邮票的正确轮换

编辑:

pdf是由pdf专家创建的。创建空白pdf,添加戳记批注(图像),旋转页面并添加其他批注

我这样更新以测试行为:

public void testExtractFromAddStamp() throws IOException {
    try (InputStream resource = new FileInputStream("/tmp/test.pdf");
         PdfReader pdfReader = new PdfReader(resource);
         PdfDocument pdfDocument = new PdfDocument(pdfReader)    ) {
         saveAnnotationImages(pdfDocument, new File(RESULT_FOLDER, "add_stamp").getPath());

         // TEST    
         PdfAnnotation stamp1 = pdfDocument.getPage(1).getAnnotations().get(0);
         PdfAnnotation stamp2 = pdfDocument.getPage(1).getAnnotations().get(1);

         PdfNumber rotation1 = (PdfNumber) stamp1.getPdfObject().getAsDictionary(PdfName.P).get(PdfName.Rotate);
         PdfNumber rotation2 = (PdfNumber) stamp2.getPdfObject().getAsDictionary(PdfName.P).get(PdfName.Rotate);

         System.out.println(rotation1); // Shows 90
         System.out.println(rotation2); // Shows 90
    }
}
一般来说 PDF对象的许多属性决定了批注中图像的最终旋转。你必须把它们结合起来。

页面旋转 首先,可以旋转显示注释的页面:

旋转 整数 (可选;可继承)显示或打印时页面顺时针旋转的度数。该值应为90的倍数。默认值:0

(ISO 32000-2表31-页面对象中的条目)

注释是否与其页面一起旋转取决于注释的NoRotate标志:

五, 去硝酸盐 (PDF 1.3)如果已设置,请不要旋转注释的外观以匹配页面的旋转。注释矩形的左上角应保持在页面上的固定位置,与页面旋转无关

(ISO 32000-2表167-注释标志)

(ISO 32000-2图78-带正转标记的坐标调整)

因此,只有当注释的NoRotate标志清除时,才需要考虑页面旋转

外观矩阵 如果注释具有外观流(本例中的注释就是这样做的,因为位图图像绘制说明就在这里),则该外观流包含一个变换矩阵属性,该属性控制外观流在注释矩形中的旋转方式:

AP 词典 (可选;PDF 1.2)外观词典,规定如何在页面上直观显示注释(见12.5.5,“外观流”)

(ISO 32000-2表166-所有注释词典共有的条目)

从PDF 1.2开始,注释可以指定一个或多个外观流,作为早期版本中可用的简单边框和颜色特征的替代。外观流使注释能够以不同的方式可视化显示,以反映其与用户的交互。每个外观流都是一个表单XObject(见8.10,“表单XObject”):一个自包含的内容流,应在注释矩形内呈现

本子条款中概述的算法应用于从外观XObject的坐标系(由其矩阵条目定义;参见“表95-参考字典中的条目”)映射到默认用户空间中的注释矩形:

算法:外观流

  • 外观的边界框(由其BBox条目指定)应使用矩阵进行变换,以生成具有任意方向的四边形。变换后的外观框是包含该四边形的最小直立矩形

  • 应计算矩阵A,以缩放和平移变换后的外观框,使其与注释矩形的边缘对齐(由Rect条目指定)。A将变换后的外观框的左下角(具有最小x和y坐标的角)和右上角(具有最大x和y坐标的角)映射到注释矩形的相应角

  • 矩阵应与A连接,形成一个矩阵AA,从外观坐标系映射到默认用户空间中注释的矩形:

    AA=矩阵×A

  • (ISO 32000-2第12.5.5节-外观流)

    因此,必须检查该外观矩阵的旋转系数。如果矩阵也倾斜或镜像,则首先必须决定如何对矩阵进行因式分解,因为旋转角度值取决于该因式分解

    电流变换矩阵 当位图图像通过内容流中的图像绘制指令绘制时,它不一定在外观边界框中垂直绘制,而是按照绘制时当前变换矩阵ta的值来绘制

    与外观矩阵一样,此变换矩阵可能必须分解以确定其应用的旋转角度

    就你而言 让我们看一下您的示例PDF

    页面旋转

    页面旋转显式为0

    外观矩阵

    两个注释外观流都没有矩阵条目。因此,默认情况下使用单位矩阵,这意味着没有旋转

    电流变换矩阵

    注释的外观流构建非常简单,在保存图形状态和恢复图形状态指令对之间,更改当前转换矩阵并绘制图像

    四个注释的变换矩阵包含(1)不旋转,(2)逆时针旋转90°,3)逆时针旋转180°,以及(4)逆时针旋转270°


    这对应于页面上可见的4个注释。

    需要更多详细信息,包括创建和旋转d的代码