Axiso

Notes

Aligner les montants en police Helvetica sur les PDF

Magento — novembre 2014 , , ,

Magento 1.9 génère les PDF avec l’ajout de la police de caractère LinLibertine. Or, celle-ci ne faisant pas partie des 14 polices PDF de base, elle est incluse aux fichiers générés, augmentant leur volume à plus de 1Mo.
Afin de réduire le volume du fichier à 20Ko, le recours à ces 14 polices est possible. Cependant, l’affichage des textes en colonne semble alors mal géré par Zend Framework et sa fonction widthsForGlyphs(). Ceci est particulièrement visible dans le bloc des totaux insertTotals() de Magento où les nombres supérieurs à 1000€ sont placés avec un décalage à gauche.
Apparemment, la valeur de largeur attribuée à certains caractères n’est pas correcte. Le caractère de l’espace particulièrement.
Voici une correction qui peut fonctionner, dans app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php :

public function widthForStringUsingFontSize($string, $font, $fontSize)
    {
        $drawingString = '"libiconv"' == ICONV_IMPL ?
            iconv('UTF-8', 'UTF-16BE//IGNORE', $string) :
            @iconv('UTF-8', 'UTF-16BE', $string);

        $widthDecrease = 0;

        $characters = array();
        for ($i = 0; $i < strlen($drawingString); $i++) {
            $characters[] = $character = (ord($drawingString[$i++]) << 8) | ord($drawingString[$i]);
            if(160 == $character) {
                $widthDecrease += 222;
            }
        }
        
        $glyphs = $font->glyphNumbersForCharacters($characters);
        $widths = $font->widthsForGlyphs($glyphs);
        $stringWidth = ((array_sum($widths) - $widthDecrease) / $font->getUnitsPerEm()) * $fontSize;
        return $stringWidth;

    }

Ainsi une largeur plus adaptée est appliquée. 160 est le code du caractère espacement. La valeur 222 correspond à la différence constatée entre celles de l’espace et de la virgule : catactère -> 556, espace -> 500, virgule -> 278.
C’est étrange mais ça fonctionne.