PDF 的编码问题
Encoding problems with PDF
我有一个(非常简单的)java Spring Boot/REST 服务,它从输入中呈现 PDF 并使用 IntelliJ 对其进行测试。
我使用 pdfbox 作为创建此类 pdf 的工具。
一个特点是,除了它想要的常规内容之外,客户还可以 byte[]
提供附件。
问题
当用户试用该服务时,最终文档只有附件部分有空白页。
调查
- 尝试使用 IntelliJ 和 HTTP REST 客户端并遇到同样的问题
- 将附件保存到单独的文件中,提供清晰正确的文档
- 将整个文档(常规内容+附件)保存到文件中也是正确的。
- 用postman,文档没问题.....
当我注意到 postman 运行良好时,我更改了生成的响应文件的 IntelliJ 默认文件编码(从 UTF-8 到 ISO-8859-1),然后后续文档清晰正确。 ..
不要忘记这个问题似乎只影响附件。常规内容总是没问题。
问题
- 我想这是附件内容的编码问题。我说得对吗?
- 我可以在不影响用户服务的情况下自行处理这个问题吗?意思是避免一些开发人员站在他们这边。
其他信息
我尝试了很多字节转换都没有成功,例如:
new String(annexe, StandardCharsets.ISO_8859_1).getBytes(StandardCharsets.UTF_8);
但每次我都遇到异常:
java.io.IOException: java.util.zip.DataFormatException: invalid stored block lengths
文档作为 byte[]
发回,如下所示:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
pdfDocument.save(outputStream);
pdfDocument.close();
return outputStream.toByteArray();
将文档保存到文件中的代码完全相同,只是给出了一个 FileOutputStream
。
附件是这样添加到文档中的:
for(byte[] content : annexes) {
PDDocument annex = PDDocument.load(content);
for (PDPage page : annex .getPages()) {
pdfDocument.importPage(page);
}
}
我也试过 PDFMergerUtility 但得到了相同的结果(附件空白页)
感谢 Tilman Hausherr 的建议,我尝试用 Base64.getEncoder().encode(...)
对 byte[]
进行编码,这成功了!
客户端现在必须处理 Base64 编码的字符串,但它至少可以工作。
谢谢!
我有一个(非常简单的)java Spring Boot/REST 服务,它从输入中呈现 PDF 并使用 IntelliJ 对其进行测试。
我使用 pdfbox 作为创建此类 pdf 的工具。
一个特点是,除了它想要的常规内容之外,客户还可以 byte[]
提供附件。
问题
当用户试用该服务时,最终文档只有附件部分有空白页。
调查
- 尝试使用 IntelliJ 和 HTTP REST 客户端并遇到同样的问题
- 将附件保存到单独的文件中,提供清晰正确的文档
- 将整个文档(常规内容+附件)保存到文件中也是正确的。
- 用postman,文档没问题.....
当我注意到 postman 运行良好时,我更改了生成的响应文件的 IntelliJ 默认文件编码(从 UTF-8 到 ISO-8859-1),然后后续文档清晰正确。 .. 不要忘记这个问题似乎只影响附件。常规内容总是没问题。
问题
- 我想这是附件内容的编码问题。我说得对吗?
- 我可以在不影响用户服务的情况下自行处理这个问题吗?意思是避免一些开发人员站在他们这边。
其他信息
我尝试了很多字节转换都没有成功,例如:
new String(annexe, StandardCharsets.ISO_8859_1).getBytes(StandardCharsets.UTF_8);
但每次我都遇到异常:
java.io.IOException: java.util.zip.DataFormatException: invalid stored block lengths
文档作为 byte[]
发回,如下所示:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
pdfDocument.save(outputStream);
pdfDocument.close();
return outputStream.toByteArray();
将文档保存到文件中的代码完全相同,只是给出了一个 FileOutputStream
。
附件是这样添加到文档中的:
for(byte[] content : annexes) {
PDDocument annex = PDDocument.load(content);
for (PDPage page : annex .getPages()) {
pdfDocument.importPage(page);
}
}
我也试过 PDFMergerUtility 但得到了相同的结果(附件空白页)
感谢 Tilman Hausherr 的建议,我尝试用 Base64.getEncoder().encode(...)
对 byte[]
进行编码,这成功了!
客户端现在必须处理 Base64 编码的字符串,但它至少可以工作。
谢谢!