Java中如何从二进制数据创建PDF文件

4

我从web服务获取了以下字符串:

"JVBERi0xLjQKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovR3JvdXAgPDwvVHlwZSAvR3JvdXAgL1MgL1RyYW5zcGFyZW5jeSAvQ1MgL0RldmljZVJHQj4"

这应该是一个pdf文件,我尝试了apache的pdfbox库,但它将内容写成pdf中的文本。我已经尝试使用ByteArrayInputStream,但创建的pdf无效或损坏,这是我编写的一些代码。

public void escribePdf(String texto, String rutaSalida) throws IOException{

    byte[] biteToRead = texto.getBytes();
    InputStream is = new ByteArrayInputStream(biteToRead );
    DataOutputStream out = new DataOutputStream(new  BufferedOutputStream(new FileOutputStream(new File(rutaSalida))));
    int c;
    while((c = is.read()) != -1) {
        out.writeByte(c);
    }
    out.close();
    is.close();

}

1
那个字符串很可能是一个有效的二进制PDF文件,但你必须知道它是用什么编码方式生成的。Java默认使用UTF-16编码,但并不是所有的编码方式都会产生相同的值。 - James Sullivan
该 PDF 是使用 PHP 创建的。 - OJVM
1
不要使用DataOutputStream。直接写入BufferedOutputStream。 - Stephen C
3个回答

3
[JDK 8]
导入:
import java.io.*;
import java.util.Base64;

代码:

// Get bytes, most important part
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
// Write to file
DataOutputStream os = new DataOutputStream(new FileOutputStream("output.pdf"));
os.write(bytes);
os.close();

这个对我有用。谢谢 Cordova,我给你点赞。 - asifaftab87
有没有办法让 output.pdf 存储在内存中而不是写入文件? - Kevin Wang

3

这是Base64编码的数据(很可能是UTF-8格式),在使用前必须对其进行解码,例如:

import sun.misc.BASE64Decoder;

...

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(biteToRead);

编辑: 对于 Java 版本大于等于 1.8,请使用以下代码:

byte[] decodedBytes = java.util.Base64.getDecoder().decode(biteToRead);

2

您的字符串明显是Base64编码。它被翻译为:

%PDF-1.4
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Group <</Type /Group /S /Transparency /CS /DeviceRG

这似乎不是一个完整的pdf文件,我认为您从服务器读取数据的方式可能存在问题。

从Java 6开始,他们在sun包外添加了一个base64转换器。

byte [] bytes = javax.xml.bind.DatatypeConverte.parseBase64Binary(texto);
new String(bytes, "UTF-8");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接