如何获取文档页脚的内容

如何获得文档的页脚里的内容,这是我的代码,但是输出的内容有些奇怪,请问应该修改代码呢


public static void getFooter(InputStream inputStream) {
        Document doc = null;
        try {
            doc = new Document(inputStream);
            for (Section section : doc.getSections()) {
                // There are three kinds of footer and header types.
                // 1 -  The "First" header/footer, which only appears on the first page of a section.
                HeaderFooter footer = section.getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_FIRST);
                if (footer != null) {
                    System.out.println(footer.getFirstParagraph().getText());
                }

                // 2 -  The "Primary" header/footer, which appears on odd pages.
                footer = section.getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
                if (footer != null) {
                    System.out.println(footer.getFirstParagraph().getText());
                }

                // 3 -  The "Even" header/footer, which appears on even pages.
                footer = section.getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_EVEN);
                if (footer != null) {
                    System.out.println(footer.getFirstParagraph().getText());
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

@Zhimayou

要获取文档页脚的内容,您可以使用以下代码示例。您的代码基本上是正确的,但可能需要确保在输出内容时处理每种页脚类型的情况。以下是一个改进的示例:

public static void getFooter(InputStream inputStream) {
    Document doc = null;
    try {
        doc = new Document(inputStream);
        for (Section section : doc.getSections()) {
            // 获取三种类型的页脚
            for (HeaderFooterType type : new HeaderFooterType[]{
                    HeaderFooterType.FOOTER_FIRST,
                    HeaderFooterType.FOOTER_PRIMARY,
                    HeaderFooterType.FOOTER_EVEN}) {
                
                HeaderFooter footer = section.getHeadersFooters().getByHeaderFooterType(type);
                if (footer != null) {
                    // 输出页脚的所有段落内容
                    for (Paragraph paragraph : footer.getParagraphs()) {
                        System.out.println(paragraph.getText());
                    }
                }
            }
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

在这个示例中,我们遍历每种页脚类型,并输出每个段落的文本内容。这将确保您获取到页脚中的所有文本,而不仅仅是第一个段落的内容。

如果您仍然遇到输出内容奇怪的问题,请检查文档中页脚的实际内容,确保它们确实包含您期望的文本。

@Zhimayou 你可以使用例如section.getHeadersFooters().get(HeaderFooterType.FOOTER_PRIMARY).toString(SaveFormat.TEXT);,但你能澄清一下你遇到了什么问题,你希望得到什么结果吗?此外,如果可能的话,请提供您使用的文件。

我的文档就是一个页脚标了页码的普通文档,我想要对页码今晚检查,看是否有页码缺失等问题,因此我想要获得每一页的页码的实际数值,这是有可能实现的吗?

@Zhimayou 遗憾的是,没有任何解决方案可以从任意页面获取页脚字段,通常这些字段会在 MS Word 中更改后更新,或者使用 doc.updateFields();。文档可以有 3 种页脚类型,页脚中的文本用于文档中的每一页。您可以检查这 3 种页脚类型的内容,并在需要时进行修正。

section.getHeadersFooters().get(HeaderFooterType.FOOTER_PRIMARY).toString(SaveFormat.TEXT); - 该代码可以获得正确的输出。

您可以使用此代码仔细检查所有页脚页面,但我认为此代码没有用处,您可以在不进行此检查的情况下修复您的内容。

Document doc = new Document("input.docx");

for (int page = 0; page < doc.getPageCount(); page++) {
    Document docCheck = doc.extractPages(page, 1);
    docCheck.updateFields();

    Section section = docCheck.getFirstSection();
    PageSetup pageSetup = section.getPageSetup();
    int footerType;
    if (pageSetup.getDifferentFirstPageHeaderFooter() && page == 0)
        footerType = HeaderFooterType.FOOTER_FIRST;
    else if (pageSetup.getOddAndEvenPagesHeaderFooter() && page % 2 != 0)
        footerType = HeaderFooterType.FOOTER_EVEN;
    else if (pageSetup.getOddAndEvenPagesHeaderFooter() && page % 2 == 0)
        footerType = HeaderFooterType.FOOTER_PRIMARY;
    else
        footerType = HeaderFooterType.FOOTER_PRIMARY;

    HeaderFooter footer = section.getHeadersFooters().getByHeaderFooterType(footerType);
    if (footer != null) {
        System.out.println(footer.toString(SaveFormat.TEXT).trim());
    }
}

好的,我明白了。感谢您的回复,给予我非常大的帮助!

1 Like