You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动