当前位置: 首页 > 知识库问答 >
问题:

如何检索PDFSTAMP注释旋转

龙弘盛
2023-03-14

参考如何检索图像的一个PdfStamp注释,如何检索旋转的邮票注释?

我创建了一个文档,放置了一个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
    }
}

共有1个答案

叶裕
2023-03-14

PDF对象的许多属性决定了注释中图像的最终旋转。你必须把它们结合起来考虑。

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

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

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

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

5 NoRotate(PDF 1.3)如果设置,不要旋转注释的外观以匹配页面的旋转。注释矩形的左上角应保持在页面上的固定位置,无论页面旋转如何。

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

(ISO 32000-2图78-使用NoRotate标志进行坐标调整)

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

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

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

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

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

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

算法:外观流

>

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

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

AA=矩阵×A

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

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

当位图图像是通过图像绘制指令在内容流中绘制时,它不一定是在外观边界框中直立绘制的,它是在绘制时由当前变换矩阵ta的值指示的。

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

让我们看一下您的html" target="_blank">示例PDF。

页面旋转显式为0。

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

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

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

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

 类似资料:
  • 问题内容: 如何在带注释的方法上检索注释的值? 我有: 问题答案: 获取实例。 获取注释。 获取注释属性值。 就像是: 当然,您需要捕获/处理适当的异常。上述假定您确实是从当前类检索方法(替换用其他方式)和有关方法是公共的(使用,如果事实并非如此)

  • 我知道有可能通过名字得到一个类,使用 是否可以通过名称检索注释?我尝试了这个: 然后将c转换为

  • 我想从AOP连接点检索一个注释。我能够通过反射获得注释,但无法通过ProcedingJoinPoint获得注释。 我的注释方法 我的绒球

  • 问题内容: 我想从源HTML中删除这些标签及其内容。 问题答案: 当搜索你基本上使用的地方被定义这个API。但是,注释并不是技术上的元素,因此您可能会感到困惑,但它们仍然是由节点名标识的节点。 让我们看看这可能如何工作:

  • 我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到 6.使用@SpringBootApplication注释 可以使用单个@SpringBootApplication注释来启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:在应用程序所在的包上启用@Component扫

  • 所以目前,这是我所做的(不起作用): 这是与建议匹配的代码: 以及由junit测试生成的跟踪: