Bonjour
J’up ce post, car la problématique m’a été posée.
Effectivement lorsqu’on choisit un modèle de facturation via un fichier ODT, la description des lignes des produits n’est pas mise en forme. C’est dû à une caractéristique des fichiers ODT dont la création est assez archaïque (c’est seulement mon avis).
Il faudrait savoir si avec l’implantation d’une Lib html2odt, le besoin serait comblé.
Je note ici des pistes :
https://github.com/cybermonde/odtphp ou https://github.com/socianova/php2odt
Néanmoins, il est toujours possible d’avoir une amélioration du code actuel pour garder un visuel sur ODT proche du visuel HTML.
Il faudrait compléter mes ajouts, mais voici un exemple pour le saut de ligne, l’italique, le gras et le souligné. Les listes à puces peuvent être également intégrées ainsi qu’une certaine gestion de texte en couleur.
Il faut remplacer les fonctions « htmlToUTFAndPreOdf » et « preOdfToOdf » dans le fichier « odf.php » présent à l’emplacement « /htdocs/includes/odtphp/ ».
/**
* Function to convert a HTML string into an ODT string
*
* @param string $value String to convert
*/
public function htmlToUTFAndPreOdf($value) {
// We decode into utf8, entities
$value=dol_html_entity_decode($value, ENT_QUOTES);
// We convert html tags
$ishtml=dol_textishtml($value);
if ($ishtml)
{
$value=preg_replace('/<br \/>/i',"__n__",$value);
$value=preg_replace('/<strong>/','__g__',$value);
$value=preg_replace('/<\/strong>/','__g2__',$value);
//$value=preg_replace('/<span[^>]+>/','<text:span>',$value);
//$value=preg_replace('/<\/span>/','</text:span>',$value);
$value=preg_replace('/<em>/','__i__',$value);
$value=preg_replace('/<\/em>/','__i2__',$value);
$value=preg_replace('/<u>/','__u__',$value);
$value=preg_replace('/<\/u>/','__u2__',$value);
$value=dol_string_nohtmltag($value, 0);
}
return $value;
}
/**
* Function to convert a HTML string into an ODT string
*
* @param string $value String to convert
*/
public function preOdfToOdf($value) {
$value = str_replace('__n__', '<text:line-break/>', $value);
$value = str_replace('__g__','<text:span text:style-name="bold">',$value);
$value = str_replace('__g2__','</text:span>',$value);
$value = str_replace('__u__','<text:span text:style-name="underline">',$value);
$value = str_replace('__u2__','</text:span>',$value);
$value = str_replace('__i__','<text:span text:style-name="italic">',$value);
$value = str_replace('__i2__','</text:span>',$value);
return $value;
}
Il faut ensuite éditer le fichier « content.xml » présent dans l’archive ODT (ouvrir le modèle ODT avec WinZip, 7 Zip, etc.) ; pour y placer
entre office:automatic-styles\ et </office:automatic-styles> le code suivant :
<style:style style:name="strong" style:family="text"><style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/></style:style><style:style style:name="italic" style:family="text"><style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/></style:style><style:style style:name="underline" style:family="text"><style:text-properties style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color"/></style:style>
Il faut faire ça pour chaque modèle ODT qui servira à générer un document.
À compléter au besoin… Normalement ça fonctionne correctement !
NB (Memo futur): Mettre une condition pour une option type « ODT_FORMAT_DESC » dans le code pour activer ou non le formatage.