【问题标题】:Base64 encode and decode not give same resultBase64 编码和解码结果不一样
【发布时间】:2015-07-29 07:28:45
【问题描述】:

我整天都在用头撞墙。我有一个我们生成的 PDF 文件。 PDF 文件在 Acrobat 中看起来不错。

我需要用 base64 对文件进行编码。使用 Apache 编解码器库我这样做:

String base64buf = Base64.encodeBase64String( m_reportText.getBytes( "UTF-8" ) );

作为测试,我将 base64buf 写入文件:

Files.write( new File( "report.b64" ).toPath(), base64buf.getBytes( "UTF-8") );

然后我把它转换回来,看看它是否工作:

String encodedName = "report.b64";
String decodedName = "report.pdf";

// Read original file.
byte[] encodedBuffer = Files.readAllBytes( new File( encodedName ).toPath() );

// Decode
byte[] decodedBuffer = Base64.decodeBase64( encodedBuffer );

// Write out decodedBuffer.
FileOutputStream outputStream = new FileOutputStream( decodedName );
outputStream.write( decodedBuffer );
outputStream.close();

我在 Acrobat 中打开 report.pdf,它是一个空白文档。它的页数正确(全部为空白)。

我在这里错过了什么?

【问题讨论】:

  • 当我认为m_reportText 是一个包含PDF 的成员变量并且这个成员变量是String 时,我是否正确解释了您的代码?如果是这种情况,您无论如何都会遇到麻烦,因为 PDF 文件是二进制文件,而不是文本文件(即使它们部分看起来是文本文件)。而且你对该变量内容的 UTF-8 编码(不是 base64 字符串,虽然)会破坏它。

标签: java pdf base64 apache-commons-codec


【解决方案1】:

m_reportText 是一个字符串,因此包含 Unicode 文本。然而,PDF 通常是二进制数据。这应该真正避免,因为在两个方向上的多余转换是有损且容易出错的。对于 hack,您可以尝试将 PDF 字节存储和检索为 ISO-8859-1。

使用byte[] m_reportText

【讨论】:

  • 您和 mkl 是正确的,因为 m_reportText 是 PDF。我查看了 m_reportText 是如何生成的,它是二进制形式,然后通过 toString("iso-8859-1") 转换为文本。将“UTF-8”更改为“iso-8859”(在上面)代码有效。谢谢。
  • @MikeDee 这就是 Joop 所说的 hack(实际上只是一种 hack,将 PDF 存储在 String 中表明软件架构存在缺陷);因此,您应该将其作为正确答案。
  • 尽管它可以工作,但它会进行两次 (ISO-8859-1) 与 String 之间的转换,这可以通过 byte[] 更快地进行,或者通过 ByteArrayOutputStream. 来创建 PDF。
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多