2012-07-23 5 views
5

Ho un'applet firmata che recupera un documento PDF da un servizio Web, quindi lo archivia in una cartella temporanea e lo apre su Adobe Reader. Vorrei evitare di memorizzare il file localmente, ma non so davvero come ottenerlo (sono un novizio con le applet Java).Apri "documento array byte" da un'applet Java

Se si trattasse di un'applicazione Web (ad esempio un servlet semplice), potrei semplicemente scrivere il contenuto PDF su ServletResponse; quindi il browser lo memorizzerà nella sua cartella temporanea e lo aprirà con Adobe Reader (o qualsiasi altra applicazione associata al tipo MIME).

C'è un modo simile per farlo ... su un'applet Java?

Questo è il mio codice finora:

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")); 
    } 
} 

Qualsiasi alternativa al Desktop.open(File), che mi permette di passare un byte[] invece di un File?

+1

un modo o nell'altro, dovrà essere creato il file temporaneo. Non sono sicuro di cosa non funzioni con 'Desktop.open'. È un modo perfettamente valido di fare le cose. –

+0

+1. Non penso che tu possa evitare il file temporaneo, ma forse c'è un modo per averlo gestito dal browser (in modo che venga ripulito una volta terminato). – Thilo

+0

È possibile creare il file temporaneo, purché sia ​​gestito dal browser, proprio come con l'esempio ServletResponse. Quello che mi piacerebbe evitare è la creazione di diversi file PDF "da qualche parte" nell'unità locale dell'utente (ad esempio C: /temp/a-document.pdf, C: /temp/another-one.pdf, ecc.) – AJPerez

risposta

2
  1. Adobe reader can handle URL:s, quindi potrebbe essere un passo in avanti per creare una temporanea (?) URL per il documento.

  2. In caso contrario è possibile creare un file temporaneo utilizzo File.createTempFile, dal API:

    Crea un nuovo file vuoto nella directory specificata, utilizzando i dati prefisso e suffisso stringhe per generare il suo nome. Se questo metodo restituisce con successo, allora è garantito che:

    1. Il file indicato con il nome di percorso astratto restituita non esisteva prima di questo metodo è stato invocato, e
    2. Né questo metodo né alcuna delle sue varianti tornerà lo stesso percorso astratto ancora nell'attuale richiamo della macchina virtuale.

    Questo metodo fornisce solo una parte di un file temporaneo. Per organizzare la cancellazione automatica di un file creato con questo metodo, utilizzare il metodo deleteOnExit().

    Quindi nel tuo caso, invece di creare un nuovo file da soli è possibile utilizzare questo metodo:

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

Non esattamente cosa Stavo cercando ... ma potrebbe risolvere il problema. Lo proverò. Grazie! – AJPerez

+0

Risposta aggiornata con un'altra opzione. Ma il file temporaneo non è poi così male. – dacwe

+0

La seconda opzione non è applicabile nel mio caso: non posso memorizzare il file sul lato server, quindi non posso aprirlo con un URL. Ad ogni modo, la tua prima opzione era già abbastanza buona :) – AJPerez