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

如何使用iText7移除PDF页眉页脚或读取PDF时跳过页眉页脚

iText7 提取文本排除页眉页脚实现方案

两种需求都可以实现,根据业务场景选对应方案即可:

方案1:提取时跳过页眉页脚区域(推荐,不修改原文件)

iText7的文本提取基于坐标匹配规则实现,PDF页面坐标系原点在页面左下角,y轴向上递增,页眉固定在页面顶部区域、页脚固定在页面底部区域,只要过滤掉这两个坐标区间的文本块,就能只拿到正文内容,不需要改动原PDF文件。
实现步骤:

  • 先抽样确认目标PDF的页眉、页脚占页面的高度值,常规A4尺寸PDF(页面总高度842pt)的页眉高度一般在40-70pt区间,页脚高度一般在30-60pt区间,可以根据实际排版调整
  • 自定义文本事件过滤器,判断每个文本块的坐标位置,丢弃落在页眉、页脚区间的内容

可直接参考的实现代码:

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.canvas.parser.EventType;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
import com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo;
import com.itextpdf.kernel.pdf.canvas.parser.filter.IEventFilter;
import com.itextpdf.kernel.pdf.canvas.parser.listener.FilteredTextEventListener;
import com.itextpdf.kernel.pdf.canvas.parser.listener.LocationTextExtractionStrategy;
import com.itextpdf.kernel.geom.Rectangle;
import java.io.IOException;

public class PdfBodyTextExtractor {
    public static String extractPureText(String pdfPath, float headerHeight, float footerHeight) throws IOException {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfPath));
        StringBuilder contentBuilder = new StringBuilder();

        IEventFilter bodyAreaFilter = new IEventFilter() {
            @Override
            public boolean accept(IEventData data, EventType type) {
                if (!EventType.RENDER_TEXT.equals(type)) {
                    return false;
                }
                TextRenderInfo textInfo = (TextRenderInfo) data;
                Rectangle textPos = textInfo.getDescentLine().getBoundingRectangle();
                PdfPage currentPage = pdfDoc.getPage(textInfo.getCanvas().getDocument().getPageNumber(textInfo.getCanvas()));
                float pageTotalHeight = currentPage.getPageSize().getHeight();
                float textY = textPos.getY();
                // 过滤底部页脚区域、顶部页眉区域的文本
                return textY >= footerHeight && textY <= pageTotalHeight - headerHeight;
            }
        };

        for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) {
            FilteredTextEventListener extractListener = new FilteredTextEventListener(
                    new LocationTextExtractionStrategy(),
                    bodyAreaFilter
            );
            new PdfCanvasProcessor(extractListener).processPageContent(pdfDoc.getPage(pageNum));
            contentBuilder.append(extractListener.getResultantText()).append("\n");
        }
        pdfDoc.close();
        return contentBuilder.toString();
    }
}

如果待处理的PDF页面尺寸不统一,不要写死页眉页脚高度,要根据每页的实际尺寸动态计算过滤区间;如果页眉页脚带侧边装饰,也可以增加x轴坐标的过滤规则,排除左右边距的非正文内容。

方案2:直接删除PDF内的页眉页脚(适合需要输出清洗后PDF的场景)

如果需要永久去掉PDF里的页眉页脚,可以通过iText7遍历页面内容流,识别页眉页脚区域对应的文本、图片绘制指令,将对应指令从内容流中移除后另存为新PDF,后续再做文本提取就不会混入页眉页脚内容。
注意事项:

  • 操作前务必备份原文件,内容流的修改不可逆
  • 如果页眉页脚是通过注释、水印、独立XObject资源实现的,需要额外遍历对应资源节点做删除,不能只清理页面主内容流
  • 排版复杂的PDF用这种方案容易误删正文内容,稳定性不如区域过滤提取方案,非必要优先选第一种方案。

针对页眉页脚位置不固定、和正文坐标有重叠的特殊PDF,可以通过多页文本特征匹配识别页眉页脚:页眉页脚的核心特征是在多页相近位置重复出现高度相似的内容,结合坐标聚类+文本重复度判断的方式识别,准确率比固定高度过滤更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:21:38