2017-05-05 3 views
0

Existe-t-il une liste de styles CSS supportés par pdfHTML? Leur site indique "Il supporte les parties de la spécification HTML 5 et CSS 3 qui s'appliquent dans un contexte PDF" ce qui est logique (par exemple, aucune raison de prendre en charge les animations CSS).pdfHTML n'honore pas les styles CSS

Cependant, j'ai un problème avec ce que je pense est un style simple qui s'appliquerait aux PDF.

Un problème est le style suivant n'est pas appliqué aux images:

img { max-width: 100%; } 

J'ai quelques images où leurs largeurs sont physiquement plus grande que la page afin que les images se couper. Je ne suis pas en mesure de modifier le code source HTML et je ne suis pas capable de réduire les fichiers image. Quelle est la meilleure pratique pour obtenir des images à se comporter?

Un autre problème concerne les styles de tableau. Ceux-ci ne sont pas appliqués:

table { vertical-align: top; } 
tr:nth-child(even) { background: #eee; } 

Comme le problème d'images, ces styles ont l'air bien dans un navigateur. Quelle est la méthode recommandée pour mettre en forme des tableaux?

Merci

+0

'nième child' sera pris en charge dans la prochaine version de 'pdfHTML'. Il est déjà pris en charge dans la version actuelle de l'instantané de développement. –

+0

@AlexeySubach: Cool. Des pensées sur la largeur de l'image? C'est le tueur en ce moment. Si je peux obtenir les images à s'asseoir sur la page, je pense que nous devrions être en mesure d'avancer en utilisant itext. – Chuck

Répondre

1

max-width propriété CSS est pas pris en charge encore pdfHTML. Vous pouvez essayer de contourner ce problème en utilisant votre propre applicateur CSS personnalisé pour les images et réinitialiser la largeur à ce que vous voulez si certaines conditions sont remplies.

Tout d'abord, créez le CSS pour Applicateur images:

final ICssApplier customImageCssApplier = new BlockCssApplier() { 
    @Override 
    public void apply(ProcessorContext context, IStylesContainer stylesContainer, ITagWorker tagWorker) { 
     super.apply(context, stylesContainer, tagWorker); 
     if (tagWorker.getElementResult() instanceof Image) { 
      Image img = (Image) tagWorker.getElementResult(); 
      if (img.getImageWidth() > 500) { 
       img.setWidth(UnitValue.createPercentValue(100)); 
      } 
     } 
    } 
}; 

Ensuite, assurez-vous que c'est récupéré dans Applicateur l'usine. Pour ce faire, vous devrez passer outre getCustomCssApplier:

ICssApplierFactory cssApplierFactory = new DefaultCssApplierFactory() { 
    @Override 
    public ICssApplier getCustomCssApplier(IElementNode tag) { 
     if (TagConstants.IMG.equals(tag.name())) { 
      return customImageCssApplier; 
     } 
     return super.getCustomCssApplier(tag); 
    } 
}; 

Enfin, créez ConverterProperties et assurez-vous de passer à HtmlConverter.convertToPdf:

ConverterProperties properties = new ConverterProperties().setCssApplierFactory(cssApplierFactory); 
+0

Il s'agit cependant d'une solution de contournement qui peut ne pas fonctionner dans les cas difficiles. Vous pouvez jouer avec la taille de l'image physique qui déclenchera votre logique ('500' dans mon exemple) et avec la taille de l'image définie il (vous pourriez vouloir essayer les deux avec le pourcentage et la valeur de point). Veuillez vous assurer de communiquer vos problèmes à l'équipe de vente si vous ne parvenez toujours pas à les résoudre. –

+0

J'écris ceci en C#. La ligne supérieure de vos deux blocs est-elle similaire à: public class CustomImageCssApplier: BlockCssApplier ... et alors la méthode serait: public override void Apply (blahblah)? – Chuck

+0

Je pense que cela fonctionne pour nous, merci. Je vais mettre dans ma demande que le formatage de l'image de css soit ajouté lorsque cela est possible. D'ici là, j'attends avec impatience la mise en forme de la table qui sera un vrai glaçage sur le gâteau. – Chuck