PDF.js调用getDocument报InvalidPDFException: Invalid Pdf Structure错误
解决PDF.js加载iText生成PDF时的"invalid pdf structure"错误
我之前也碰到过一模一样的问题!你说在线工具能正常生成可用PDF,那基本可以排除iText生成的PDF本身结构有问题,大概率是前后端数据传输或Angular处理二进制数据时出了岔子,下面是几个你可以逐一排查的关键点:
1. 确保Angular请求时正确设置responseType
这是最常见的原因!Angular默认会把HTTP响应解析为JSON或文本,但PDF是二进制数据,一旦被当成文本解析再转回字节,就会破坏PDF的二进制结构。你需要在HTTP请求中显式指定responseType: 'blob'或者responseType: 'arraybuffer':
// 示例:Angular HTTP请求代码 downloadPdf() { return this.http.get('/your-api-endpoint', { responseType: 'blob' // 重点:告诉Angular这是二进制Blob数据 }).pipe( map(blob => { // 这里拿到的blob可以直接传给PDF.js return blob; }) ); }
2. 给PDF.js传入正确格式的数据源
PDF.js的getDocument方法支持多种输入类型,但如果是从后端拿到的字节数据,一定要转成Uint8Array或者Blob URL,不能直接传原始的byte数组或字符串:
方式一:使用Uint8Array
import * as pdfjsLib from 'pdfjs-dist'; // 假设你从HTTP请求拿到的是ArrayBuffer或byte数组 const pdfUint8Array = new Uint8Array(pdfBytes); pdfjsLib.getDocument(pdfUint8Array).promise.then(pdf => { // 成功加载PDF,后续处理逻辑 console.log('PDF加载成功', pdf); }).catch(error => { console.error('PDF加载失败', error); });
方式二:使用Blob URL
const pdfBlob = new Blob([pdfBytes], { type: 'application/pdf' }); const pdfUrl = URL.createObjectURL(pdfBlob); pdfjsLib.getDocument(pdfUrl).promise.then(pdf => { // 处理PDF // 记得用完后释放URL,避免内存泄漏 URL.revokeObjectURL(pdfUrl); });
3. 检查后端的响应头是否正确
后端返回PDF时,必须确保响应头设置正确,否则Angular可能会错误解析数据:
- 必须设置
Content-Type: application/pdf - 不要设置不必要的
Content-Encoding(比如gzip,除非前端专门处理了解压)
以Spring Boot为例,正确的返回代码应该是这样的:
@GetMapping("/download-pdf") public ResponseEntity<byte[]> generatePdf() { // 你的iText生成PDF byte[]的逻辑 byte[] pdfBytes = yourPdfGenerationLogic(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); // 如果需要让浏览器下载,可以加这个头,不过你是给PDF.js用的话可选 // headers.setContentDispositionFormData("attachment", "document.pdf"); return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK); }
4. 排查Angular拦截器是否篡改了响应
如果你在Angular里配置了全局HTTP拦截器,检查一下有没有对响应做了统一处理(比如转换为字符串、添加额外数据等),如果有,要排除你的PDF接口,避免二进制数据被篡改。
按照上面的步骤排查下来,基本就能解决"invalid pdf structure"的问题了!我当时就是因为忘了设置responseType踩了这个坑😂
内容的提问来源于stack exchange,提问作者jackjoesmith




