我正在尝试在json中保存pdf文件的内容,并考虑将pdf保存为从byte []转换的String值。
byte[] byteArray = feature.convertPdfToByteArray(Paths.get("path.pdf"));
String byteString = new String(byteArray, StandardCharsets.UTF_8);
byte[] newByteArray = byteString.getBytes(StandardCharsets.UTF_8);
String secondString = new String(newByteArray, StandardCharsets.UTF_8);
System.out.println(secondString.equals(byteString));
System.out.println(Arrays.equals(byteArray, newByteArray));
System.out.println(byteArray.length + " vs " + newByteArray.length);
上述代码的结果如下:
true
false
421371 vs 760998
两个String
相等,而两个byte[]
不相等。为什么这样以及如何在json中正确转换/保存pdf?
答案 0 :(得分:3)
从PDF文件中读取时,您可能使用了错误的字符集。
例如,ISO-8859-1中不存在字符é
(e
具有急性):
byte[] byteArray = "é".getBytes(StandardCharsets.ISO_8859_1);
String byteString = new String(byteArray, StandardCharsets.UTF_8);
byte[] newByteArray = byteString.getBytes(StandardCharsets.UTF_8);
String secondString = new String(newByteArray, StandardCharsets.UTF_8);
System.out.println(secondString.equals(byteString));
System.out.println(Arrays.equals(byteArray, newByteArray));
System.out.println(byteArray.length + " vs " + newByteArray.length);
输出:
true
false
1 vs 3
答案 1 :(得分:0)
如果byteArray
确实包含PDF,则很可能是无效的UTF-8。因此,无论何处
String byteString = new String(byteArray, StandardCharsets.UTF_8);
偶然发现一个无效的UTF-8字节序列,它将用Unicode替换字符替换它。即这条线会损坏您的数据,很可能无法修复。以下是
byte[] newByteArray = byteString.getBytes(StandardCharsets.UTF_8);
不会导致原始字节数组,而是导致它的损坏版本。
另一方面,newByteArray
是UTF-8编码给定字符串byteString
的结果。因此,newByteArray
是有效的UTF-8和
String secondString = new String(newByteArray, StandardCharsets.UTF_8);
不需要替换UTF-8映射之外的任何内容,特别是byteString
和secondString
相等。
正如@mammago在评论中解释的那样,
JSON不是二进制内容(如文件)的适当格式。您应该使用类似base64的东西从PDF中创建一个字符串并将其存储在JSON对象中。