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

如何利用iText7访问PDF页面的页眉、页脚与脚注?

使用iText7提取PDF页眉、页脚及脚注的方法

刚好之前做过类似的需求,用iText7处理PDF页眉、页脚还有脚注,主要有几个可行的方向,结合你的需求给你拆解一下:

1. 直接读取PDF中的Artifacts(工件)

很多规范的PDF会把页眉、页脚标记为artifacts——也就是PDF中用于辅助呈现但不属于主内容的元素。iText7提供了直接获取页面artifacts的API,你可以通过判断artifact的角色来筛选页眉和页脚:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("your-target.pdf"));
for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) {
    PdfPage page = pdfDoc.getPage(pageNum);
    // 获取当前页面的所有artifacts
    List<PdfArtifact> artifacts = page.getArtifacts();
    if (artifacts != null && !artifacts.isEmpty()) {
        for (PdfArtifact artifact : artifacts) {
            // 判断artifact的角色是否为页眉或页脚
            if (PdfName.Header.equals(artifact.getRole()) || PdfName.Footer.equals(artifact.getRole())) {
                // 获取artifact的边界区域,提取该区域内的文本
                Rectangle artifactRect = artifact.getBBox();
                SimpleTextExtractionStrategy extractionStrategy = new SimpleTextExtractionStrategy();
                String artifactText = PdfTextExtractor.getTextFromPage(page, extractionStrategy, artifactRect);
                
                String type = PdfName.Header.equals(artifact.getRole()) ? "页眉" : "页脚";
                System.out.printf("第%d页 %s 内容:%s%n", pageNum, type, artifactText.trim());
            }
        }
    }
}
pdfDoc.close();

不过要注意:不是所有PDF都会把页眉页脚标记为artifacts,这种情况下就得用其他方法兜底。

2. 基于页面位置的文本提取

页眉页脚通常固定在页面的顶部或底部区域,你可以通过定义页面的顶部/底部百分比区域,提取对应区域的文本:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("your-target.pdf"));
// 自定义页眉/页脚占页面的比例,这里设为10%
float headerRatio = 0.1f;
float footerRatio = 0.1f;

for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) {
    PdfPage page = pdfDoc.getPage(pageNum);
    Rectangle mediaBox = page.getMediaBox();
    float pageHeight = mediaBox.getHeight();
    
    // 定义页眉区域:页面顶部10%
    Rectangle headerArea = new Rectangle(
        mediaBox.getLeft(),
        mediaBox.getTop() - pageHeight * headerRatio,
        mediaBox.getWidth(),
        pageHeight * headerRatio
    );
    // 定义页脚区域:页面底部10%
    Rectangle footerArea = new Rectangle(
        mediaBox.getLeft(),
        mediaBox.getBottom(),
        mediaBox.getWidth(),
        pageHeight * footerRatio
    );
    
    // 提取对应区域的文本
    String headerText = PdfTextExtractor.getTextFromPage(page, new SimpleTextExtractionStrategy(), headerArea);
    String footerText = PdfTextExtractor.getTextFromPage(page, new SimpleTextExtractionStrategy(), footerArea);
    
    System.out.printf("第%d页 页眉:%s%n", pageNum, headerText.trim());
    System.out.printf("第%d页 页脚:%s%n", pageNum, footerText.trim());
}
pdfDoc.close();

这种方法的优势是兼容性强,缺点是可能会误提取顶部/底部的普通内容。你可以结合文本重复性判断优化——比如多页重复出现的顶部文本更可能是页眉,这样过滤掉非重复的内容。

3. 利用*标记PDF(Tagged PDF)*的结构元素

如果目标PDF是标记PDF(也就是带有结构化语义的PDF),页眉页脚可能被标记为<Header>或<Footer>结构元素,你可以通过遍历结构树来获取:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("your-target.pdf"));
PdfStructTreeRoot structRoot = pdfDoc.getStructTreeRoot();

if (structRoot != null) {
    for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) {
        PdfPage page = pdfDoc.getPage(pageNum);
        // 获取当前页面对应的结构元素列表
        List<PdfStructElem> pageStructElems = structRoot.findPageElem(page);
        
        for (PdfStructElem elem : pageStructElems) {
            PdfName elemRole = elem.getRole();
            if (PdfName.Header.equals(elemRole) || PdfName.Footer.equals(elemRole)) {
                String elemText = PdfTextExtractor.getTextFromPage(page, new LocationTextExtractionStrategy(), elem.getBBox());
                String type = PdfName.Header.equals(elemRole) ? "页眉" : "页脚";
                System.out.printf("第%d页 结构化%s:%s%n", pageNum, type, elemText.trim());
            }
        }
    }
}
pdfDoc.close();

关于脚注的额外说明

脚注通常在页脚上方或底部区域,你可以:

  • 缩小页脚区域的比例,把下方的小区域单独作为脚注提取;
  • 结合文本样式(比如字号更小、颜色不同)来区分,iText7可以通过RenderListener获取文本的字体信息;
  • 如果是标记PDF,脚注可能带有<Footnote>的结构标签,可以直接筛选。

内容的提问来源于stack exchange,提问作者Speed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:00:45