We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

如何获取world文档中所有目录结构的信息呢

现在使用的Aspose.Words的版本是21.3
如何获取world文档中所有目录信息呢?或者是获取到world文档中目录结构的标题信息呢?
就是我在文档中设置了一级标题二级标题等属性,现在想在上传的时候读取到这些信息,构建目录索引

@Guilin 在您的情况下,您可以使用 DocumentVisitorParagraphFormat.StyleIdentifier 来获取标题段落。 例如看下面的简单代码和测试文档。

Document doc = new Document(@"C:\Temp\in.docx");
doc.Accept(new HeadingVisitor());
private class HeadingVisitor : DocumentVisitor
{
    public override VisitorAction VisitParagraphStart(Paragraph paragraph)
    {
        string text = paragraph.ToString(SaveFormat.Text).Trim();
        switch (paragraph.ParagraphFormat.StyleIdentifier)
        {
            case StyleIdentifier.Heading1:
                Console.WriteLine(text);
                break;
            case StyleIdentifier.Heading2:
                Console.WriteLine("\t{0}", text);
                break;
            case StyleIdentifier.Heading3:
                Console.WriteLine("\t\t{0}", text);
                break;
            case StyleIdentifier.Heading4:
                Console.WriteLine("\t\t\t{0}", text);
                break;
        }
                
        return VisitorAction.Continue;
    }
}

in.docx (12.7 KB)

怎么判断我读取到的是段落还是页眉页脚呢?

广西壮族自治区巴马盘阳河流域生态环境保护条例.docx (396.6 KB)
读取这个文件开头会有奇怪的数值,已经去掉了页眉与页脚

@Guilin 您可以实现 VisitHeaderFooterStartVisitHeaderFooterEnd 来检测页眉/页脚内容

private class HeadingVisitor : DocumentVisitor
{
    public override VisitorAction VisitHeaderFooterStart(HeaderFooter headerFooter)
    {
        Console.WriteLine("Start {0}", headerFooter.HeaderFooterType);
        return VisitorAction.Continue;
    }

    public override VisitorAction VisitHeaderFooterEnd(HeaderFooter headerFooter)
    {
        Console.WriteLine("End {0}", headerFooter.HeaderFooterType);
        return VisitorAction.Continue;
    }

    public override VisitorAction VisitParagraphStart(Paragraph paragraph)
    {
        string text = paragraph.ToString(SaveFormat.Text).Trim();
        switch (paragraph.ParagraphFormat.StyleIdentifier)
        {
            case StyleIdentifier.Heading1:
                Console.WriteLine(text);
                break;
            case StyleIdentifier.Heading2:
                Console.WriteLine("\t{0}", text);
                break;
            case StyleIdentifier.Heading3:
                Console.WriteLine("\t\t{0}", text);
                break;
            case StyleIdentifier.Heading4:
                Console.WriteLine("\t\t\t{0}", text);
                break;
        }
                
        return VisitorAction.Continue;
    }
}

image.png (28.8 KB)
image.png (1.6 KB)
image.png (36.6 KB)
读取到文档中“文号:法释〔2016〕25号“这个位置的时候, 按您所说的判断这个判断到的类型还是读取到的类型是 FooterPrimary,并没有区分开始页眉还是页脚呢

@Guilin 目前尚不清楚您的预期输出是什么。 你能详细说明一下你的要求吗?
提供的代码仅打印标题 1-3 段落,正如我所见,这与您附加的文档一样有效。
如果您还需要获得其他样式的段落,您可以在 switch 中添加额外的案例。