IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Génération de PDF et renvoi "en stream" vers le client sans mise en cache


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Génération de PDF et renvoi "en stream" vers le client sans mise en cache
    Bonjour,

    J'utilise Apache pour générer des pdf suites à des transformations XML --> XSL-FO.

    Dans l'état actuel des choses, le fichier généré doit être physiquement copié sur le client.

    Y aurait-il un moyen d'ouvrir le pdf sur le client, sans que le fichier soit physiquement copié sur le disque dur, en utilisant une technique de streaming ou équivalent ???

    L'idée serait que le fichier soit également vérouillé et que donc l'utilisateur ne puisse que le consulter, pas le sauvegarder sur sa machine.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    A priori, s'il faut sauvegarder c'est que le content type renvoyé par le serveur n'est pas bon. Ce devrait être application/pdf.

    Sinon, tu ne pourras pas empêcher le client de pouvoir sauvegarder le fichier, je pense : le fichier est téléchargé par le navigateur, mis dans son cache (même temporairement) puis mis en mémoire d'Acrobat Reader. Acrobat a tout le fichier : il peut proposer de sauvegarder une copie du fichier en local. Le seul moyen que je vois c'est de passer par une autre techno que PDF pour consulter les fichiers.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    A priori, s'il faut sauvegarder c'est que le content type renvoyé par le serveur n'est pas bon. Ce devrait être application/pdf.
    La bonne chose, c'est que j'ai la main sur le code (même si ce n'est pas moi qui l'ai écrit) : le type renvoyé est bien "application/pdf", comme on peut le voir ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    	private void sendPDF(byte[] content, HttpServletResponse response)
    			throws IOException {
    		// Send the result back to the client
    		response.setContentType("application/pdf");
    		response.setContentLength(content.length);
    		response.getOutputStream().write(content);
    		response.getOutputStream().flush();
    	}
     
    	/**
             * Renders an XSL-FO file into a PDF file. The PDF is written to a byte
             * array that is returned as the method's result.
             * 
             * @param fo
             *            the XSL-FO file
             * @param response
             *            HTTP response object
             * @throws FOPException
             *             If an error occurs during the rendering of the XSL-FO
             * @throws TransformerException
             *             If an error occurs while parsing the input file
             * @throws IOException
             *             In case of an I/O problem
             */
    	protected void renderFO(String fo, HttpServletResponse response,String adr, String host)
    			throws FOPException, TransformerException, IOException {
     
    		// Setup source
    		Source foSrc = convertString2Source(fo);
     
    		// Setup the identity transformation
    		Transformer transformer = this.transFactory.newTransformer();
    		transformer.setURIResolver(this.uriResolver);
     
    		// Start transformation and rendering process
    		render(foSrc, transformer, response, adr,  host);
    	}
    Donc je pense que mon problème est plutôt du côté du code exécuté par le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    	public static int sendToServlet(String paramsUrl) throws IOException {
    		int result = okCode;
    		int tmpStr = 0;
     
    		String nameFile = new String("temp" + System.currentTimeMillis()
    				+ ".pdf");
    		File pdfFile = new File(TEMP_PATH, nameFile);
    		try {
    			if (paramsUrl != null) {
    				url = new URL(URL + paramsUrl);
    				debug("url = " + url);
    				server = url.openConnection();
    				server.connect();
    				InputStream is = server.getInputStream();
    				if (is.available() > 5) {
    					// PDF file
    					FileOutputStream sortie = new FileOutputStream(pdfFile);
    					for (tmpStr = is.read(); tmpStr != -1; tmpStr = is.read()) {
    						sortie.write(tmpStr);
    					}
     
    					sortie.flush();
    					sortie.close();
    					Runtime.getRuntime().exec("cmd /c " + pdfFile);
    				} else {
    					// Error code
    					StringWriter writer = new StringWriter();
    					for (; tmpStr != -1; tmpStr = is.read()) {
    						writer.write(tmpStr);
    					}
     
    					writer.flush();
    					writer.close();
    					try {
    						result = Integer.parseInt(writer.toString().trim());
    					} catch (NumberFormatException ex) {
    						result = errorCode;
    					}
    				}
    				is.close();
    			} else {
    				debug("internal error : UrlParams empty");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		debug("Transformation result : " + String.valueOf(result));
     
    		return result;
    	}
    Une idée pour, au pire, ne laisser le pdf présent sur le disque que le temps de la lecture du pdf. Et dans ce cas, comment appeler le lecteur pdf sans lui spécifier un nom précis de fichier stocké sur le disque dur ???

    Encore merci !

Discussions similaires

  1. Recherche outil de génération de Pdf
    Par yomax dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 17/02/2006, 08h58
  2. [XML - XSL-FO] génération doc PDF ?
    Par ghohm dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 10/02/2006, 00h12
  3. [iText] Conseils sur la génération de pdf
    Par GreenJay dans le forum Documents
    Réponses: 6
    Dernier message: 25/03/2005, 01h49
  4. Automatiser génération fichier PDF
    Par psyco2604 dans le forum ASP
    Réponses: 4
    Dernier message: 24/11/2004, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo