我需要通过文档布局收集器获取表格相对于页面的坐标,但是获取到的布局收集器是空的,为什么?怎么解决?
// 获取表格所属文档,并强制更新文档布局(以确保后续布局信息准确)
if (table.Document is not Document document)
return (null, null);
// 确保布局信息是最新的
document.UpdatePageLayout();
// 创建布局收集器和枚举器
LayoutCollector layoutCollector = new(document);
LayoutEnumerator layoutEnumerator = new(document);
// 定位到表格对应的布局节点
var layoutEntity = layoutCollector.GetEntity(table);
if (layoutEntity == null)
return (null, null);
@yujiuyao 根据我们的文档,您不能使用表节点 - LayoutCollector.GetEntity | Aspose.Words for .NET.
您可以获取单元格段落节点,然后与父行一起计算表格边界。
Here is the code:
Document doc = new Document("input.docx");
LayoutCollector layoutCollector = new LayoutCollector(doc);
LayoutEnumerator enumerator = new LayoutEnumerator(doc);
Table table = doc.FirstSection.Body.Tables[0];
// Get the table's position and dimensions.
RectangleF tableBounds = GetTableBounds(layoutCollector, enumerator, table);
Console.WriteLine("Table coordinates:");
Console.WriteLine($"X: {tableBounds.X}");
Console.WriteLine($"Y: {tableBounds.Y}");
Console.WriteLine($"Width: {tableBounds.Width}");
Console.WriteLine($"Height: {tableBounds.Height}");
public RectangleF GetTableBounds(LayoutCollector layoutCollector, LayoutEnumerator enumerator, Table table)
{
// Initialize min and max coordinates.
float minX = float.MaxValue;
float minY = float.MaxValue;
float maxX = float.MinValue;
float maxY = float.MinValue;
foreach (Row row in table.Rows)
{
// Get the layout entity for the cell paragraph.
enumerator.Current = layoutCollector.GetEntity(row.FirstCell.FirstParagraph);
enumerator.MoveParent(LayoutEntityType.Row);
if (enumerator != null && enumerator.Type == LayoutEntityType.Row)
{
RectangleF rowBounds = enumerator.Rectangle;
// Update min/max coordinates.
minX = Math.Min(minX, rowBounds.X);
minY = Math.Min(minY, rowBounds.Y);
maxX = Math.Max(maxX, rowBounds.X + rowBounds.Width);
maxY = Math.Max(maxY, rowBounds.Y + rowBounds.Height);
}
}
// Return the bounding rectangle.
return new RectangleF(minX, minY, maxX - minX, maxY - minY);
}
谢谢,关于布局管理我再好好看下文档,您这个方法是对的
您好,那我在var layoutEntity = layoutCollector.GetEntity(shape);时,为什么也会出现获取到为空的情况呢?
@yujiuyao 这可能是因为该形状嵌套在另一个形状中,或者位于文档的页眉/页脚中。LayoutCollector
和 LayoutEnumerator
类仅适用于主文档主体中的内容和顶级形状。