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

使用PDFBox为PDF添加PDF附件时打开失败的技术求助

问题原因
  • 你将纯文本字符串作为附件内容,却把附件的MIME子类型设置为application/pdf。PDF阅读器会尝试按照PDF文件的格式规范解析这些内容,但纯文本并不符合PDF的文件结构(比如缺少%PDF-1.x这类必要文件头标识),因此打开时会报错。
  • 当你改为text/plain和.txt扩展名时,阅读器按纯文本格式解析内容,内容本身就是文本,所以能正常打开。
解决方案

根据使用场景,分两种情况处理:

1. 测试场景:生成合法的PDF测试附件

如果仅需测试PDF附件功能,可以生成一个符合规范的简单PDF作为附件内容,替代纯文本:

// 替换原代码中byte[] data = entry.getValue().getBytes();及后续相关行
// 生成测试用PDF文档
PDDocument attachmentDoc = new PDDocument();
attachmentDoc.addPage(new PDPage());
PDPageContentStream attachmentStream = new PDPageContentStream(attachmentDoc, attachmentDoc.getPage(0));
attachmentStream.beginText();
attachmentStream.setFont(PDType1Font.HELVETICA, 12);
attachmentStream.newLineAtOffset(50, 700);
attachmentStream.showText(entry.getValue());
attachmentStream.endText();
attachmentStream.close();

ByteArrayOutputStream attachmentBaos = new ByteArrayOutputStream();
attachmentDoc.save(attachmentBaos);
attachmentDoc.close();
byte[] data = attachmentBaos.toByteArray();
ByteArrayInputStream fakeFile = new ByteArrayInputStream(data);

2. 实际业务场景:读取真实PDF文件作为附件

如果是业务中需要添加真实的PDF附件,直接读取目标PDF文件的二进制数据:

// 示例:读取本地PDF文件
File pdfFile = new File("/path/to/your/real/pdf/file.pdf");
byte[] data = Files.readAllBytes(pdfFile.toPath());
ByteArrayInputStream fakeFile = new ByteArrayInputStream(data);

额外注意事项

  • 严格保证附件的MIME子类型与实际内容格式匹配:PDF文件用application/pdf,纯文本用text/plain,禁止混用。
  • PDF是二进制格式,无需额外指定UTF-8编码,直接使用文件原始二进制数据即可。

内容的提问来源于stack exchange,提问作者Rosa Mystica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:17:48