Java 如何检索PDFSTAMP注释旋转
参考,如何检索戳记批注的旋转 我创建了一个文档,放置了一个stamp1,翻页并添加了另一个stamp2。 文档正常(stamp1图像旋转,stamp2未旋转),但提取的图像完全相同(方向相同) 我可以用它来实现页面旋转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
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-参考字典中的条目”)映射到默认用户空间中的注释矩形:
算法:外观流
这对应于页面上可见的4个注释。需要更多详细信息,包括创建和旋转d的代码