Java PDFBox提取PDF页面异常:仅提取第1页且输出重复
嘿,我之前用PDFBox提取非连续页面时也踩过一模一样的坑,来帮你排查下问题!
核心问题分析
你提到设置了stripper.setStartPage(3)但还是提取不到第3页,而且输出重复,大概率是两个原因:
- 没设置结束页(endPage):PDFTextStripper默认的
endPage是Integer.MAX_VALUE,如果你只设了startPage(3),它会提取从第3页到文档最后一页的所有内容——但如果你的代码里之前已经提取过第1页,可能因为stripper的状态没重置,导致内容混在一起; - 输出流未清空/重用:如果你多次提取时用了同一个输出流(比如ByteArrayOutputStream),之前的内容会被追加进去,就会出现重复输出的情况。
解决方法:单独提取每一页,重置stripper和流
要提取非连续的页面(比如第1和第3页),最稳妥的方式是为每个目标页单独创建PDFTextStripper实例,同时明确设置startPage和endPage为同一个页码,并且每次用新的输出流。
给你写个可直接用的代码示例:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; public class PDFPageExtractor { public static void main(String[] args) { File targetPdf = new File("your-document.pdf"); // 替换成你的PDF路径 try (PDDocument document = PDDocument.load(targetPdf)) { // 分别提取第1页和第3页 String page1Content = extractSinglePage(document, 1); String page3Content = extractSinglePage(document, 3); // 输出结果 System.out.println("=== 第1页内容 ==="); System.out.println(page1Content); System.out.println("\n=== 第3页内容 ==="); System.out.println(page3Content); } catch (IOException e) { System.err.println("处理PDF时出错:" + e.getMessage()); e.printStackTrace(); } } /** * 提取PDF中指定页码的文本内容 * @param document 已加载的PDDocument实例 * @param pageNumber 目标页码(从1开始) * @return 该页的文本内容 * @throws IOException 处理PDF时的IO异常 */ private static String extractSinglePage(PDDocument document, int pageNumber) throws IOException { // 每次提取都创建新的stripper,避免状态污染 PDFTextStripper textStripper = new PDFTextStripper(); // 同时设置开始和结束页为目标页码,确保只提取这一页 textStripper.setStartPage(pageNumber); textStripper.setEndPage(pageNumber); // 用新的输出流,避免内容叠加 try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(baos, StandardCharsets.UTF_8)) { textStripper.writeText(document, writer); writer.flush(); return baos.toString(StandardCharsets.UTF_8); } } }
额外检查点
- 确认你的PDF确实有第3页:如果文档总页数不足3,PDFBox会自动提取最后一页的内容,可能让你误以为没生效;
- 避免重复使用同一个PDFTextStripper实例:如果一定要重用,记得每次提取前调用
setStartPage和setEndPage重置,同时清空输出流。
内容的提问来源于stack exchange,提问作者Poltu
相关产品推荐
相关产品推荐

