Apache PdfBox 2.0.8:PDF原始字节转String后存文件空白问题求解
解决Apache PdfBox 2.0.8中PDF字节转String后生成空白PDF的问题
问题根源:二进制数据不能直接转普通String
PDF是二进制格式文件,里面包含大量非文本字节(比如字体二进制流、图像数据、压缩的页面内容等)。当你把PDF的字节数组直接用new String(byte[])转换时,JVM会使用平台默认的字符编码(比如UTF-8)去解码这些字节,但很多PDF字节并不符合该编码的规则,无法被正确解析为字符。这时JVM会把无法解码的字节替换成占位符(比如�),导致原始字节信息永久丢失。当你再把这个String转回字节数组写入文件时,字节已经和原始PDF不一样了,自然会生成空白或损坏的PDF。
正确的解决方案:用Base64编码存储二进制数据
如果必须把PDF数据转换成String类型(比如要存到数据库、通过文本接口传输等),应该使用Base64编码——它能把任意二进制数据转换成纯文本的字符串,且不会丢失任何信息。需要还原PDF时,再把Base64字符串解码回字节数组即可。
代码示例:PDF转Base64 String
import org.apache.pdfbox.pdmodel.PDDocument; import java.io.ByteArrayOutputStream; import java.util.Base64; public class PdfUtils { // 将PDDocument转换为Base64编码的String public static String convertPdfToBase64String(PDDocument document) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); document.save(outputStream); byte[] pdfBytes = outputStream.toByteArray(); // 使用Base64编码器将二进制字节转为字符串 return Base64.getEncoder().encodeToString(pdfBytes); } }
代码示例:Base64 String转回PDF文件
import java.io.FileOutputStream; import java.util.Base64; public class PdfUtils { // 将Base64字符串转回PDF文件 public static void convertBase64StringToPdf(String base64Pdf, String outputFilePath) throws Exception { byte[] pdfBytes = Base64.getDecoder().decode(base64Pdf); try (FileOutputStream fos = new FileOutputStream(outputFilePath)) { fos.write(pdfBytes); } } }
额外建议
如果没有必须转成String的需求,建议直接操作字节数组,跳过编码转换步骤——这样不仅效率更高,还能避免编码错误带来的问题。比如直接把ByteArrayOutputStream的字节写入文件:
document.save(new FileOutputStream("output.pdf"));
内容的提问来源于stack exchange,提问作者iperezmel78
相关产品推荐
相关产品推荐

