9
votes

Des chemins relatifs dans la soucoupe volante XHTML?

J'utilise de la soucoupe volante pour rendre certains documents PDF des chaînes à XHTML. Mon code est quelque chose comme: xxx

Ce que j'essaie de comprendre est, lors de l'utilisation de cette méthode, où sont les chemins relatifs du XHTML résolu? Par exemple, pour les images ou les feuilles de style. Je suis capable d'utiliser cette méthode pour générer avec succès un document texte, mais je dois comprendre comment référencer mes images et mes CSS.


0 commentaires

7 Réponses :


20
votes

La méthode SetDocument () prend deux paramètres: document et URL. Le paramètre URL indique l'URL de base utilisée pour adopter aux chemins relatifs apparaissant dans le XHTML, tels que dans les balises IMG.

Supposons que vous ayez: P>

renderer.setDocument(xhtmlDoc, "file:///C:/physical/route/to/app/");


1 commentaires

Spécification du fichier Fichier: // est important car FS recherche une URL, pas un chemin. Cela ne fonctionnera pas avec juste un chemin qui commence par c: / ou / certains / absolu / chemin .



0
votes

Vous pouvez avoir des chemins de fichiers, qui doivent être absolus ou http: // URL. Les chemins relatifs peuvent travailler mais ne sont pas portables car cela dépend de quel répertoire vous avez exécuté votre programme de


0 commentaires

1
votes

La réponse d'Atilauy est sur place pour la manière dont les choses fonctionnent par défaut dans la soucoupe volante.

La réponse plus générale est qu'elle pose la demande à UserAgentContext. Il appellera SetStBaseURL () sur UserAgentContext lorsque le document est défini. Ensuite, il appellera Résolvurl () pour résoudre les URL relatives et finalement resolveandopenstream () lorsqu'il souhaite lire les données de ressources réelles.

Eh bien, cette réponse est probablement trop tardive pour que vous l'utilise de toute façon, mais j'avais besoin d'une réponse comme celle-ci lorsque je précise, et la définition d'un contexte d'agent utilisateur personnalisé est la solution que j'ai retrouvée à l'aide.


0 commentaires

8
votes

Cette semaine, j'ai travaillé dessus et je vous donne ce qui a fonctionné bien pour moi.

Dans la vie réelle, votre document XHTML pointe vers plusieurs ressources (images, CSS, etc.) avec des chemins relatifs. Vous devez également expliquer à voler la soucoupe où les trouver. Ils peuvent être dans votre classe de classe ou dans votre système de fichiers. (S'ils sont sur le réseau, vous pouvez simplement définir l'URL de base, de sorte que cela ne vous aidera pas) p>

Vous devez donc prolonger l'itexturerAgent comme celui-ci: P>

// Output stream containing the result
ByteArrayOutputStream baos = new ByteArrayOutputStream();

ITextRenderer renderer = new ITextRenderer();
ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
callback.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(callback);

renderer.setDocumentFromString(htmlSourceAsString);

renderer.layout();
renderer.createPDF(baos);
renderer.finishPDF();


0 commentaires

0
votes

Je pense qu'une approche plus facile serait la suivante: xxx


0 commentaires

0
votes

Un autre moyen de résoudre les chemins consiste à remplacer useragentCallback # résolveuri code>, qui offre un comportement plus dynamique qu'une URL fixe (comme dans la réponse d'Atilauy, qui semble très valable pour la plupart des cas).

C'est comme ça que je fais un xhtmlpane code> Utiliser des feuilles de style générées dynamiquement générées: p> xxx pré>

alors je l'utilise comme ça: p>

  final UserAgentCallback defaultAgentCallback =
      xhtmlPanel.getSharedContext().getUserAgentCallback() ;
  xhtmlPanel.getSharedContext().setUserAgentCallback(
      interceptCssResourceLoading( defaultAgentCallback, cssResources ) ) ;
  xhtmlPanel.setDocumentFromString( xhtml, null, new XhtmlNamespaceHandler() ) ;


0 commentaires

2
votes

La meilleure solution pour moi était la suivante: xxx

puis tous les styles et images fournis dans HTML (comme xxx

) ont été rendus comme prévu.


2 commentaires

Cela doit être une solution à base de printemps.


Est-ce que cela fonctionne si nous avons une consttroller? Je suppose que vous mettez tous les CSS et l'image dans le répertoire statique.