2010-07-30 24 views
0

dans mon xhtml j'ai les suivantes:soucoupe volante (de xhtmlrenderer) demande l'image 4 fois

... 
<img src="myImage.jpg" /> 
... 

et je rends comme ceci:

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(XMLResource.load(in).getDocument(), url); 
renderer.layout(); 
renderer.createPDF(out); 

le PDF résultant est comme prévu, mais je remarque que l'image (qui n'est incluse qu'une fois dans le xhtml et ne rend qu'une seule fois) est demandée 4 fois. Maintenant, en plus du problème évident du téléchargement de données supplémentaires, ce ne serait pas vraiment un problème pour la plupart des gens.

cependant, je dois mettre en œuvre une « fin sur l'utilisation » cache d'images pour les images dynamiques et cela devient un vrai casse-tête ...

pourquoi ne soucoupe volante ont besoin pour faire 4 demandes de l'image si elle ne le rend une fois?

Répondre

0

Je viens de passer en revue le code et il n'y a pas de solution ici (sans une réécriture de itext & soucoupe volante).

La première fois que le flux est ouvert est juste pour tester si elle peut être ouverte, les données ne sont pas lues.

la deuxième fois est la lecture itext de l'en-tête pour déterminer le type de fichier, seuls les 4 premiers octets sont lus. La troisième fois est itext déterminer les dimensions de l'image, il semble - je ne suis pas sûr, mais je ne pense pas que d'autres que les en-têtes est lu ici non plus.

la dernière lecture est de rendre l'image.

donc l'impact de téléchargement n'est pas grande, 4 connexions url - oui, mais le flux entier ne sont transférées une fois

et mon cache « expiration sur l'utilisation » devra être « expire le 4 utilisation » à la place.

+0

Peut-être que les en-têtes http contiennent des informations sur la façon de filtrer cela? Je suppose que la première demande est une demande HEAD, que vous ne pouviez pas compter. Sinon, je dirais sthg comme "Après la première demande, la ressource est disponible pour encore 10 secondes" ou plus. – ZeissS

+0

zeiss, ils ne définissent pas d'en-têtes ou de paramètres différents pour identifier le type d'informations qu'ils vont extraire du flux. ils se contentent d'une nouvelle URL (uri) .openStream() 'à chaque fois. cela aurait été utile car je pouvais juste retourner un flux factice qui indique à l'API les informations pertinentes uniquement pour chaque requête et laisser les données réelles pour la dernière requête. Je pourrais faire ceci par l'index de demande cependant, c.-à-d. demande 1 renvoie «JPEG», demande 2 retours ... etc .. re l'idée de 10 secondes, mon approche de la 4ème demande est meilleure pour un certain nombre de raisons. – pstanton

+0

Mais sa * très * dépend de l'implémentation. Postez ceci comme une demande d'amélioration sur la liste de diffusion "itext-questions". À tout le moins, nous pourrions accélérer les appels .openStream(). –

1

Ceci est corrigé dans la dernière version de FlyingSaucer. Je me suis confirmé avec 9.0.3, bien que je crois que plusieurs versions mineures avant cela contiennent également le correctif.