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

使用PDFBox读取URL指向PDF时抛出EOF异常如何解决

报错原因
  • 你请求的URL是PDF在线预览页面的地址,不是PDF文件的直链,直接调用URL.openStream()拿到的是HTML页面内容而非PDF二进制流,PDFBox解析非PDF内容时就会触发文件尾异常
  • 服务端配置了请求校验,缺失浏览器标识(User-Agent)、来源页(Referer)等请求头时不会返回PDF资源,仅返回空响应或错误页
  • 请求返回了301/302跳转响应,默认的URL.openStream()不会自动跟随跳转,拿到的是空的跳转响应体
解决步骤
  1. 先验证流内容是否为PDF:读取流的前4个字节,判断是否为%PDF-,如果不是说明请求拿到的不是PDF资源,先修正请求逻辑
  2. 补全请求头,开启自动跳转,模拟浏览器发起请求获取真实PDF流
  3. 建议使用try-with-resources管理资源,避免PDDocument未正常关闭的问题
修正后的实现代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class PdfReader {
    public static void main(String[] args) {
        String targetUrl = "https://dms.careerbuilder.com/viewer?Token=4aeea5b52d6e48a7beca13a992540a66&key=7b6184962856e016a5cdfcb3e27c7c30b34b5caaa6607d7d4e408f4b2ebf9dfd";
        try {
            String pdfContent = readPdfContent(targetUrl);
            // 你的业务校验逻辑
            // Assert.assertTrue(pdfContent.contains("Test Kumar"));
            // Assert.assertTrue(pdfContent.contains("XXXXX"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String readPdfContent(String url) throws IOException {
        URL pdfUrl = new URL(url);
        HttpURLConnection connection = (HttpURLConnection) pdfUrl.openConnection();
        // 开启自动跟随跳转
        connection.setInstanceFollowRedirects(true);
        // 模拟浏览器请求头
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
        connection.setRequestProperty("Accept", "application/pdf,*/*");
        
        try (InputStream in = new BufferedInputStream(connection.getInputStream());
             PDDocument doc = PDDocument.load(in)) {
            int numberOfPages = doc.getNumberOfPages();
            System.out.println("总页数:" + numberOfPages);
            return new PDFTextStripper().getText(doc);
        } finally {
            connection.disconnect();
        }
    }
}
补充说明

如果补全请求头后还是拿不到PDF,说明该资源需要登录校验,你需要先拿到登录后的Cookie,加到请求头的Cookie字段中再发起请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:45:02