2014-05-19 24 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();