在itext7中将图像添加到PDF时旋转

在itext7中将图像添加到PDF时旋转,pdf,rotation,itext,itext7,Pdf,Rotation,Itext,Itext7,我使用的扩展方法是在itext7的com.itextpdf.layout.Document类型的基础上构建的,用于将图像应用于我的应用程序中的PDF文档: fun Document.writeImage(imageStream:InputStream,page:Int,x:Float,y:Float,width:Float,height:Float){ val imageData=ImageDataFactory.create(imageStream.readBytes()) val图像=图像(

我使用的扩展方法是在itext7的
com.itextpdf.layout.Document
类型的基础上构建的,用于将图像应用于我的应用程序中的PDF文档:

fun Document.writeImage(imageStream:InputStream,page:Int,x:Float,y:Float,width:Float,height:Float){
val imageData=ImageDataFactory.create(imageStream.readBytes())
val图像=图像(图像数据)
val pageHeight=pdfDocument.getPage(page).pageSize.height
图像.可缩放溶质(宽度、高度)
val lowerLeftX=x
val lowerLeftY=页面高度-y-image.imageScaledHeight
image.setFixedPosition(第页,lowerLeftX,lowerLeftY)
添加(图像)
}
总的来说,这是可行的——但有一个例外!我遇到了一个文档子集,其中图像的放置方式就像文档原点旋转90度一样。即使文档的内容正确地呈现在下面

我遇到了这个问题。我想知道是否有人能告诉我为什么itext7在编写此文档时遇到困难,以及我能做些什么来修复它——或者,它是否是itext7中
com.itextpdf.layout
的更高级别功能中的潜在缺陷


一些补充说明
  • 我知道在PDF上绘图是通过一系列连接到PDF的指令来实现的。上面的代码适用于我们过去遇到问题的其他PDF,因此
    com.itextpdf.layout.Document
    似乎在绘图之前对坐标空间进行了规范化。因此,我上面描述的问题似乎不会被itext发现
  • itext7报告的PDF中的旋转元数据来自一个“良好”的PDF,没有这个问题,它似乎与PDF中的旋转元数据相同,就像我上面链接的一样。这意味着我无法通过检测执行某种暴力修复
  • 我希望任何解决方案都不要求我通过任何形式的广泛操作来扁平化PDF

我只能谈论您共享的文档

它包含4页

/第一页的旋转属性为0,其他页的旋转属性为270(定义逆时针旋转90)

IText确实试图规范每页的坐标空间。

这就是为什么在文档的第2-4页添加图像时,图像会逆时针旋转270度

。。。即使文档的内容正确地呈现在下面

第2-4页的内容如下所示

q
0 -612 792 0 0 612 cm
/Im0 Do
Q
这是一个应用了变换的图像。
0-612 792 0 0 612 cm
表示复合变换矩阵。 来自ISO 32000

PDF格式的转换矩阵应由六个数字指定, 通常以包含六个元素的数组的形式。最 一般形式,这个数组表示为[abcdef];它可以代表 从一个坐标系到另一个坐标系的任何线性变换

我们可以从那个矩阵中提取旋转

如何分解矩阵,你可以在那里找到。

旋转由下一个矩阵定义

 0  -1 
 1   0  
这是一个-90(270)度的旋转

重要提示:在这种情况下,正角度表示逆时针旋转

ISO 32000

旋转应通过[rc rs-rs rc 0 0]产生,其中rc=cos(q) rs=sin(q),具有旋转坐标系的效果 逆时针旋转角度q的轴


因此,图像在与页面相反的方向上以相同的角度旋转。

在文档中,除第一页外,所有页面都具有270度旋转