Estoy tratando de descubrir por qué este fragmento de código en particular no funciona para mí. Tengo un applet que se supone que debe leer un .pdf y mostrarlo con una biblioteca de pdf-renderer, pero por alguna razón cuando leo en los archivos .pdf que se sientan en mi servidor, terminan como corruptos. Lo probé al volver a escribir los archivos.Java: Lectura de un archivo pdf de una URL a una matriz de bytes/ByteBuffer en una aplicación
He intentado ver el applet en IE y Firefox y se producen los archivos corruptos. Lo curioso es que cuando intento ver el applet en Safari (para Windows), ¡el archivo está realmente bien! Entiendo que la JVM podría ser diferente, pero aún estoy perdido. He compilado en Java 1.5. Las JVM son 1.6. El fragmento que lee el archivo está debajo.
public static ByteBuffer getAsByteArray(URL url) throws IOException {
ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
URLConnection connection = url.openConnection();
int contentLength = connection.getContentLength();
InputStream in = url.openStream();
byte[] buf = new byte[512];
int len;
while (true) {
len = in.read(buf);
if (len == -1) {
break;
}
tmpOut.write(buf, 0, len);
}
tmpOut.close();
ByteBuffer bb = ByteBuffer.wrap(tmpOut.toByteArray(), 0,
tmpOut.size());
//Lines below used to test if file is corrupt
//FileOutputStream fos = new FileOutputStream("C:\\abc.pdf");
//fos.write(tmpOut.toByteArray());
return bb;
}
Debo extrañar algo, y me he estado golpeando la cabeza tratando de resolverlo. Cualquier ayuda es muy apreciada. Gracias.
Editar: Para aclarar aún más mi situación, la diferencia en el archivo antes de leer a continuación con el fragmento y después, es que los que yo de salida después de leer son significativamente más pequeños de lo que originalmente son. Al abrirlos, no son reconocidos como archivos .pdf. No se lanzan excepciones que ignoro, y he intentado sonrojar en vano.
Este fragmento funciona en Safari, lo que significa que los archivos se leen en su totalidad, sin diferencias de tamaño, y se pueden abrir con cualquier lector de .pdf. En IE y Firefox, los archivos siempre terminan siendo corruptos, consistentemente el mismo tamaño más pequeño.
Supervisé la variable len (al leer un archivo de 59kb), esperando ver cuántos bytes se leen en cada ciclo. En IE y Firefox, a 18 kb, in.read (buf) devuelve un -1 como si el archivo hubiera finalizado. Safari no hace esto.
Lo seguiré y agradezco todas las sugerencias hasta ahora.
Cuando dice que el archivo está dañado, ¿a qué se refiere exactamente? Si se compara con el original, ¿qué es diferente? – Eddie
Responda la segunda parte de la pregunta de Eddie. Además, ¿es correcto el valor de contentLength? – jdigital