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

