使用iText7在.NET Core3中获取PDF图片正确坐标的方法
解决iText 7提取旋转图片坐标与宽高的问题
你当前直接从CTM矩阵中提取ctm.Get(0)、ctm.Get(4)作为宽高,Matrix.I31、Matrix.I32作为坐标的方法只适用于图片无旋转、倾斜的场景。当图片存在旋转变换时,这种提取方式会得到错误的位置与尺寸,需要通过计算矩阵变换后的图片包围盒来获取正确参数。
具体实现步骤
- 获取图片原始尺寸,结合CTM矩阵计算四个顶点的变换后坐标
- 从变换后的四个顶点中提取最小/最大的X、Y值,得到图片的真实包围盒
代码示例
ImageRenderInfo renderInfo = (ImageRenderInfo)data; Matrix ctm = renderInfo.GetImageCtm(); // 获取图片原始尺寸 Rectangle imageRect = renderInfo.GetImage().GetImageRectangle(); float imgWidth = imageRect.GetWidth(); float imgHeight = imageRect.GetHeight(); // 定义图片的四个原始顶点(左下角、右下角、右上角、左上角) float[][] vertices = { new float[] { 0, 0 }, new float[] { imgWidth, 0 }, new float[] { imgWidth, imgHeight }, new float[] { 0, imgHeight } }; // 用CTM矩阵变换每个顶点 List<Vector> transformedVertices = new List<Vector>(); foreach (var vertex in vertices) { Vector vec = new Vector(vertex[0], vertex[1], 1); transformedVertices.Add(vec.Multiply(ctm)); } // 计算包围盒的最小、最大X/Y值 float minX = float.MaxValue; float maxX = float.MinValue; float minY = float.MaxValue; float maxY = float.MinValue; foreach (Vector vec in transformedVertices) { minX = Math.Min(minX, vec.Get(0)); maxX = Math.Max(maxX, vec.Get(0)); minY = Math.Min(minY, vec.Get(1)); maxY = Math.Max(maxY, vec.Get(1)); } // 正确的位置与尺寸 float correctX = minX; float correctY = minY; float correctWidth = maxX - minX; float correctHeight = maxY - minY;
原理说明
CTM(当前变换矩阵)包含了缩放、旋转、平移等多种变换操作,直接提取矩阵元素无法反映旋转后的真实边界。通过将图片的四个顶点逐一经过矩阵变换,再取变换后坐标的极值,就能得到图片在页面上的真实包围盒,从而获取准确的位置与尺寸。
内容的提问来源于stack exchange,提问作者Miri Yit
相关产品推荐
相关产品推荐

