使用PDFBox读取URL指向PDF时抛出EOF异常如何解决
报错原因
- 你请求的URL是PDF在线预览页面的地址,不是PDF文件的直链,直接调用
URL.openStream()拿到的是HTML页面内容而非PDF二进制流,PDFBox解析非PDF内容时就会触发文件尾异常 - 服务端配置了请求校验,缺失浏览器标识(User-Agent)、来源页(Referer)等请求头时不会返回PDF资源,仅返回空响应或错误页
- 请求返回了301/302跳转响应,默认的
URL.openStream()不会自动跟随跳转,拿到的是空的跳转响应体
解决步骤
- 先验证流内容是否为PDF:读取流的前4个字节,判断是否为
%PDF-,如果不是说明请求拿到的不是PDF资源,先修正请求逻辑 - 补全请求头,开启自动跳转,模拟浏览器发起请求获取真实PDF流
- 建议使用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
相关产品推荐
相关产品推荐

