1

[nosmile]Bonjour

A moins d'avoir mal utilisé HTML2PDF Je n'arrive pas à faire prendre en compte des styles déclarés dans un fichier CSS


Dans mon fichier CSS j'ai :

.rp {
background-color: #99CC00;
background-image:url(/common/d_repet.png);
background-repeat: no-repeat;
background-position: center center;
cursortongueointer;
width: 15px;
}

et le code html envoyé avec WriteHtml :

<html>
<head>
<link rel="stylesheet" href="/common/css/agenda.css" type="text/css" />
</head>
<body>
<table><tr><td class="rp"> </td></tr></table>
</body>
</html>

et dans le pdf je n'ai pas l'image en background.

Au passage, j'ai essayé de trouver un topic sur ce sujet
Mais je n'ai pas trouvé d'outils de recherche dans ce forum ...

2

Ok je réponds à ma propre question ...

Il semblerait que HTML2PDF fait un filegetcontents du fichier CSS sans utiliser $_SERVER['DOCUMENT_ROOT']
à la ligne styleHTML.class.php ligne 1537

3

normal... comment est-ce que HTML2PDF peut savoir que ce vous indiquez est une URL absolue et non pas un PATH absolue ? HTML2PDF étant une librairie à exécuter côté serveur, si ca se trouve le document root n'existe pas (exécution en shell par exemple). C'est à vous d'indiquer un chemin sans ambiguïté. Le mieux étant d'utiliser un PATH absolue, afin de ne pas faire faire inutilement une requete réseau à php (même en locale), qu'il ne pourra en plus pas forcement résoudre, si le nom de domaine n'est pas renseigné dans votre fichier hosts.

de plus, je vous conseille fortement de regarder les exemples fournis dans le ZIP. vous verrez que les balises HEAD, HTMl, BODY, n'apparaissent jamais.

concernant la recherche : en haut à droite, il y a une loupe wink
Ancien pseudo : lolo

4

Ce n'est pas très portable de mettre un path en absolue, j'ai un serveur de test en local et un hébergeur public, je ne peux pas utiliser des PATH en absolue

normalement le serveur résoud les adresses des fichiers href, src, url avec la racine url http:,
alors que l'appli recherche le chemin coté serveur d'ou le problème

si on exécute une appli php en shell ou en cron, on a besoin de connaitre d'une façon ou d'une autre la racine
en ce qui me concerne à l'entrée de toutes applications php, je teste si DOCUMENT_ROOT ou PWD existe et le cas échéant je renseigne DOCUMENT_ROOT

J'avais mis les balise HEAD, HTML et BODY pour faire des essais, mais effectivement, je les ai enlevé

J'ai aussi corrigé dans le fichier html2pdf.class.php la ligne 2524 :

if(file_exists($background['image'])) $i_name = $background['image'];
else $i_name = $_SERVER['DOCUMENT_ROOT']."/".$background['image'];


et dans le fichier styleHTML.class.php ligne 1537 :

if(file_exists($tmp['href'])) $content = @file_get_contents($tmp['href']);
else $content = @file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$tmp['href']);


Et maintenant je n'ai plus aucun problème ...

Donc voilà une solution pour ceux qui trouve ce problème ...

5

Au fait

bravo !!!
Excellent ...

c'est le convertisseur HTML -> PDF le plus complet !!!

6

on peut, et il faut utiliser les path en absolue; car sinon, en fonction de où on appèle un fichier PHP, il ne s'y retrouvera plus... cf mes includes dans HTML2PDF. Un chemin en absolue, ca se construit wink
DIRNAME(__FILE__).'/...../css/agenda.css';

ca marche à tous les coups wink car dans ton cas, comment savoir si le fichier n'existe par car il manque le document root, ou parce qu'il n'existe vraiment pas ? de même si le chemin passé est une URL, ca va tout casser, ou faire des tests en plus avec file_exist, qui sur une URL peut ne pas marcher, ou avoir de tres gros PING.

bref, je déconseille fortement cette modification, et conseille fortement de bien construire les chemins d'accès aux différentes ressources en absolue
Ancien pseudo : lolo

7

Je ne comprends pas,

Si on veut garder la portabilité, il est impossible voire totalement déconseillé de mettre un path en absolue dans un fichier CSS

exemple :

background-image:url(/common/d_repet.png);

que mettriez vous ?

et pour
<link rel="stylesheet" href="/common/css/agenda.css" type="text/css" />

dans un fichier html pur on ne mets pas de php donc pas de DIRNAME(__FILE__)
en plus il vaut mieux aussi éviter le DRINAME(__FILE__) car si le code php n'est pas à la racine de l'url on fausse tous les accès.
Je ne vois pas comment on peut se passer d'un DOCUMENT_ROOT ou du moins quelque chose de similaire ($_SERVER['PWD']) en cron ou en shell

comment peut-on faire concrètement ?

va tout casser, ou faire des tests en plus avec file_exist, qui sur une URL peut ne pas marcher, ou avoir de tres gros PING.


Oui vous avez raison pour file_exists smile , ce n'est pas la bonne solution ...
il vaut mieux faire :

$urlP = parse_url($background['image']);
$i_name = $_SERVER['DOCUMENT_ROOT']."/".$urlP['path'];


idem pour les href en général, du coup plus aucune référence aux URL, donc optimisation de PING,
Mais, rien n'est parfait !!! roll car si on a un accès à une image avec un path absolue qui n'est pas sur le même serveur ça plante ...

De toutes façon, avec ces path il y a toujours des problèmes !!!
et chez moi c'est un peu le foutoir ...

8

dans le cas de la création d'une page web, je suis tout a fait d'accord pour mettre les ressources en absolue par rapport au document root, car par la suite le navigateur sait automatiquement s'y retrouver.

mais là, ce n'est pas pour du web, mais pour créer un document PDF, il n'y a absolument plus de notion de http et autres lors de la création wink
Ancien pseudo : lolo

9

Ok, j'ai compris smile ...

C'est tout à fait logique.

J'ai été confronté au problème car j'ai voulu une compatibilité entre le skin de mon application web et l'impression en PDF en utilisant les mêmes ressources

Dans ce aurais-je dû plutôt utiliser la méthode getHtmlFromPage ?

10

en fait, getHtmlFromPage est une surcouche minime de writeHML pour convertir une page HTML classique en ce qu'attend HTML2PDF, mais il n'arrivera pas également à s'en sortir pour les urls en absolue.

Ancien pseudo : lolo