如何使用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
相关产品推荐
相关产品推荐

