You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:33:17