2012-07-23 19 views
5

Tengo un applet firmado que recupera un documento PDF de un servicio web, luego lo almacena en una carpeta temporal y lo abre en Adobe Reader. Me gustaría evitar almacenar el archivo localmente, pero realmente no sé cómo lograrlo (soy un novato con los applets de Java).Abrir el "documento de matriz de bytes" desde un applet de Java

Si fuera una aplicación web (es decir, un servlet simple), podría simplemente escribir el contenido PDF en el ServletResponse; luego el navegador lo almacenaría en su carpeta temporal y lo abriría con Adobe Reader (o cualquier aplicación asociada con el tipo MIME).

¿Hay alguna manera similar de hacer esto ... en un applet de Java?

Este es mi código hasta ahora:

public class MyListener implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     // Retrieve the document contents 
     byte[] content = webService.getPdfDocument(...); 

     // Write to file 
     File f = new File("my-document-filename.pdf"); 
     FileOutputStream fos = new FileOutputStream(f); 
     fos.write(content); 
     fos.close(); 

     // Open the file 
     Desktop.getDesktop().open(new File("my-document-filename.pdf")); 
    } 
} 

Cualquier alternativa a Desktop.open(File), lo que me permite pasar un byte[] en lugar de un File?

+1

un modo u otro, será necesario crear el archivo temporal. No estoy seguro de qué pasa con 'Desktop.open'. Es una forma perfectamente válida de hacer las cosas. –

+0

+1. No creo que pueda evitar el archivo temporal, pero tal vez haya una forma de que el navegador lo administre (para que se limpie cuando termine). – Thilo

+0

Está bien crear el archivo temporal, siempre y cuando sea administrado por el navegador, al igual que con el ejemplo de ServletResponse. Lo que me gustaría evitar es crear varios archivos PDF "en algún lugar" en la unidad local del usuario (es decir, C: /temp/a-document.pdf, C: /temp/another-one.pdf, etc.) – AJPerez

Respuesta

2
  1. Adobe reader can handle URL:s, por lo que podría ser un camino a seguir para crear un temporal (?) URL del documento.

  2. De lo contrario puede crear un archivo temporal File.createTempFile uso, desde la API:

    Crea un nuevo archivo vacío en el directorio especificado, utilizando las cadenas de prefijo y sufijo dadas a generar su nombre. Si este método devuelve correctamente a continuación, se garantiza que:

    1. El archivo denotado por la vía de acceso abstracta devuelto no existía antes de este método se invoca, y
    2. Ni este método ni ninguna de sus variantes devolverá el mismo ruta de acceso abstracta nuevamente en la invocación actual de la máquina virtual.

    Este método proporciona solo una parte de una instalación de archivo temporal. Para organizar que un archivo creado por este método se elimine automáticamente, utilice el método deleteOnExit().

    Así, en su caso, en lugar de crear un nuevo archivo de sí mismo que puede utilizar este método:

    File f = File.createTempFile("tmp", ".pdf"); 
    f.deleteOnExit(); // deletes the file on exit 
    ... 
    
+0

No es exactamente qué Estaba buscando ... pero podría resolver el problema. Lo probaré. ¡Gracias! – AJPerez

+0

Respuesta actualizada con otra opción. Pero el archivo temporal no es tan malo. – dacwe

+0

La segunda opción no es aplicable en mi caso: no puedo almacenar el archivo en el servidor, por lo que no puedo abrirlo con una URL. De todos modos, tu primera opción ya era lo suficientemente buena :) – AJPerez

Cuestiones relacionadas