A PDF file doesn't contain a
String, and trying to treat it as one is going to cause problems when
Java converts to/from the internal Unicode representation of character data. While this will work OK for textual data like HTML, it will totally destroy a PDF file.
Don't wrap the InputStream you get from the URLConnection with anything -- just call read(byte[]) on it directly, and write the data using FileOutputStream.write(byte[]). This will result in an exact copy of what you read from the URL being put into your file, and your problem should go away.
The classic implementation would look something like this: