Search code examples
javapdfhttpclientoutputstreamwriter

Blank pages in pdf after downloading it from web


I am trying to download a PDF file with HttpClient, it is downloading the PDF file but pages are blank. I can see the bytes on console from response if I print them. But when I try to write it to file it is producing a blank file.

FileUtils.writeByteArrayToFile(new File(outputFilePath), bytes);

However the file is showing correct size of 103KB and 297KB as expected but its just blank!!

I tried with Output stream as well like:

FileOutputStream fileOutputStream = new FileOutputStream(outFile);
fileOutputStream.write(bytes);

Also tried to write with UTF-8 coding like:

Writer out = new BufferedWriter( new OutputStreamWriter(
                new FileOutputStream(outFile), "UTF-8"));
        String str = new String(bytes, StandardCharsets.UTF_8);
        try {
            out.write(str);
        } finally {
            out.close();
        }

Nothing is working for me. Any suggestion is highly appreciated..

Update: I am using DefaultHttpClient.

HttpGet httpget = new HttpGet(targetURI);
HttpResponse response = null;
String htmlContents = null;
try {
    httpget = new HttpGet(url);
    response = httpclient.execute(httpget);
    InputStreamReader dataStream=new InputStreamReader(response.getEntity().getContent());
    byte[] bytes = IOUtils.toByteArray(dataStream);
...

Solution

  • You do

    InputStreamReader dataStream=new InputStreamReader(response.getEntity().getContent());
    byte[] bytes = IOUtils.toByteArray(dataStream);
    

    As has already been mentioned in comments, using a Reader class can damage binary data, e.g. PDF files. Thus, you should not wrap your content in an InputStreamReader.

    As your content can be used to construct an InputStreamReader, though, I assume response.getEntity().getContent() returns an InputStream. Such an InputStream usually can be directly used as IOUtils.toByteArray argument.

    So:

    InputStream dataStream=response.getEntity().getContent();
    byte[] bytes = IOUtils.toByteArray(dataStream);
    

    should already work for you!