FOP: comment spécifier l'image src chemin relatif?
C'est ma première question ici, j'espère que je suis en train de faire. Désolé pour mon mauvais anglais à l'avance 🙂
Je suis en utilisant JSF 2.0 (Eclipse IDE) et je suis en train de générer des fichiers PDF à l'aide d'Apache FOP 1.0.
J'ai été en mesure de faire de simples fichiers PDF à l'aide des instructions sur la Apache Fop site , mais je ne peux pas insérer une image à partir de mon dossier de l'application. Ma structure de dossier comme ceci:
Dans mon application WebContent j'ai (entre autre)
pdf_transform/xslt/transformFile.xsl, et
pdf_transform/xslt/logo.jpg
Dans transformFile.xsl j'ai
<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block>
mais quand je clik 'showPDF" dans ma servlet, j'obtiens le fichier PDF sans image (tout est là), et ce message dans la console:
SÉVÈRE: La Source qui a été renvoyé
à partir de l'URI de la résolution ne contient pas une
InputStream pour URI: logo.jpg Nov 18,
2010 5:16:49 PM
org.apache.fop.les événements.LoggingEventListener
processEvent GRAVE: l'Image ne se trouve pas.
URI: logo.jpg. (Pas de contexte info
disponibles)
J'ai essayé d'utiliser "logo.jpg' au lieu de l'url('logo.jpg'), de mettre des image sur les différents endroits à l'intérieur de WebContent dossier et à l'aide de différents navigation("./logo.jpg") mais ça n'a pas fonctionné.
Il fonctionne très bien si je l'ai mis chemin d'accès absolu (par exemple "d:/fop/images/logo.jpg") mais j'ai besoin de resurces dans mon application.
Lors de la recherche, j'ai trouvé que cela est lié à fopFactory.setURIResolver() et/ou client.setBaseURL(). Essayé quelque chose, mais il n'a pas réussir.
Je suis nouveau à la fois de l'ACI et de la FOP, et cette image de la situation a été me tracasse depuis un certain temps. Quelqu'un peut-il m'aider, ou au moins me diriger vers un tutoriel sur "comment configurer FOP pour le chemin d'accès relatif"?
EDIT: je ne veux pas de chemins absolus et application devrait fonctionner indépendamment de son emplacement sur l'ordinateur (pour être publiable). Ma recherche me dit qu'il a quelque chose à voir avec la configuration de la FOP, mais je ne sais pas comment le faire 🙂
Merci d'avance.
P. S. C'est une méthode qui est appelée pour afficher le PDF:
public void printExchangeRateList(ActionEvent event) {
BufferedOutputStream output = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
String path = externalContext.getRealPath("/");
try {
response.reset();
response.setHeader("Content-Type", "application/pdf");
output = new BufferedOutputStream(response.getOutputStream(), 10240);
File xsltfile = new File(path+"/pdf_transform/xslt/transformFile.xsl");
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));
Source src = new DOMSource(makeXML()); //my method
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} finally {
if (output != null) output.close();
/*try {
out.close();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}*/
}
} catch (Exception e) {
//TODO Auto-generated catch block
}
facesContext.responseComplete();
}
OriginalL'auteur Nikola | 2010-11-18
Vous devez vous connecter pour publier un commentaire.
j'ai trouvé la solution à mon problème. J'ai pensé que j'ai essayé, mais il semble que j'ai fait une petite erreur en retour. De toute façon, avec le code suivant
vous pouvez accéder à vos images (et autres ressources) à partir de votre fichier xslt utilisant le chemin relatif à partir de votre application WebContent dossier. Dans mon cas, je peux accéder à logo.jpg comme ce
M'a pris du temps à comprendre cela, je ne comprends pas pourquoi aucun des exemples de base, telle chose sur le net (ou je n'en trouve pas 🙂
Remarque: Dans FOP 2.0 il n'y a pas de
setBaseURL()
méthode. Au lieu de vous transmettre l'URL de base en tant que paramètre àFopFactory.newInstance()
. De nombreux autres setters ont été déplacés à FopFactoryBuilder.OriginalL'auteur Nikola
Si vous avez accès à l'url web pour les images que vous pouvez l'utiliser aussi bien lors de la génération de rapports, c'est à dire http://localhost/images/logo.jpg .
Mais alors que j'avais encore des images en local sur le serveur web, je les ai repris le chemin de l'application dans le fichier XML et l'a utilisé comme ceci:
Où la structure XML pourrait être quelque chose comme ceci:
OriginalL'auteur DanneManne
J'ai eu le même problème et j'ai essayé cette solution:
Puis, XSL, j'ai utilisé:
Pour tester si cela fonctionne, vous devriez être en mesure de voir l'image sur le protocole://lien:port/img/image.png
OriginalL'auteur fventura