create pdf from binary data in java

14,931

Solution 1

That is Base64 encoded (most probably UTF-8) data, you must decode it before using; such as:

import sun.misc.BASE64Decoder;

...

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

....

Edit: For java >= 1.8, use:

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

Solution 2

[JDK 8]

Imports:

import java.io.*;
import java.util.Base64;

Code:

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

Solution 3

Your string is definitively base 64 encoded. It translates to

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

which isnt a full pdf file by itself which leads me to belive you have something wrong with the way your reading the data from the server.

As of java 6 they added a base 64 converter outside the sun packages.

byte [] bytes = javax.xml.bind.DatatypeConverte.parseBase64Binary(texto);
new String(bytes, "UTF-8");
Share:
14,931
OJVM
Author by

OJVM

Java Developer.

Updated on June 21, 2022

Comments

  • OJVM
    OJVM almost 2 years

    I'm getting this string from a web service.

    "JVBERi0xLjQKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovR3JvdXAgPDwvVHlwZSAvR3JvdXAgL1MgL1RyYW5zcGFyZW5jeSAvQ1MgL0RldmljZVJHQj4"

    It is supposed to be a pdf file, i tried this library pdfbox from apache, but it writes the content as a text inside the pdf. I've tried with ByteArrayInputStream but the pdf created is not valid, corrupted, this is some of the code i've wrote.

    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();
    
    }
    
  • asifaftab87
    asifaftab87 about 6 years
    This one works for me. Thanks Cordova +1 from my side.
  • Kevin Wang
    Kevin Wang over 3 years
    Is there a way for output.pdf to exist, in-memory? (rather than get written to a file?