布局收集器问题

我需要通过文档布局收集器获取表格相对于页面的坐标,但是获取到的布局收集器是空的,为什么?怎么解决?

// 获取表格所属文档,并强制更新文档布局(以确保后续布局信息准确)
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 这可能是因为该形状嵌套在另一个形状中,或者位于文档的页眉/页脚中。LayoutCollectorLayoutEnumerator 类仅适用于主文档主体中的内容和顶级形状。