2014-05-19 25 views
2

我从Web服务获取此字符串。从Java中的二进制数据创建PDF

JVBERi0xLjQKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovR3JvdXAgPDwvVHlwZSAvR3JvdXAgL1MgL1RyYW5zcGFyZW5jeSAvQ1MgL0RldmljZVJHQj4”

它应该是一个PDF文件,我想这个库PDFBOX来自Apache的,但它写入内容为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编写的。默认情况下,Java使用UTF-16,但并不是所有的编码都是相同的值。 –

+0

pdf是用php创建的。 – OJVM

+1

请勿使用DataOutputStream。直接写入BufferedOutputStream。 –

回答

2

这是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); 
+1

它工作正常。谢谢。 – OJVM

1

你的字符串是明确基地64编码。它转化为

%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包之外添加了base 64转换器。

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

它也可以,谢谢。 – OJVM

1

[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();