Compter pages couleurs et noires d’un PDF

Voici une routine qui devrait être utile à tout les développeurs d’applications pré-presse. Le principe peut-être retranscrit dans n’importe quel langage et s’appuie sur l’outil ghostscript.

<?php
/**
 * Created by Dominique FERET.
 * Date: 26/08/2014
 * Time: 09:56
 */
/**
 * Fonction qui analyse la nature des pages d'un pdf.
 * @param $nomfichier   => chemin et nom du fichier.
 * @return $this        => retourne un tableau encodé en JSON contenant la liste des pages de chaque type et leur comptes
 */
function analysepdf($nomfichier)
{
    header('content-type: application/json');
    mb_internal_encoding("UTF-8");

    $o = new stdClass();
    if (file_exists($nomfichier)){
        $commande = 'gs  -o - -q -sDEVICE=inkcov "' . $nomfichier . '"';
        $lignes = array();
        exec($commande, $lignes);
        $noir = 0;
        $couleur = 0;
        $blanche = 0;
        $pagesblanches=array();
        $pagesnoires=array();
        $pagescouleurs=array();
        $numeropage=0;
        foreach ($lignes as $ligne) {

            $cyan = substr($ligne, 1, 7);
            $magenta = substr($ligne, 10, 7);
            $yellow = substr($ligne, 19, 7);
            $black = substr($ligne, 28, 7);
            if (is_numeric($cyan)&& is_numeric($magenta) && is_numeric($yellow) && is_numeric($black)){ // si la ligne contient bien une ligne de valeurs
                $numeropage++; // on ajoute 1 a la ligne en cours
                if((($cyan+$magenta+$yellow)==0)){
                    $noir++;
                    if($black==0) {
                        $pagesblanches[]=$numeropage;
                        $blanche++;
                    }
                    $pagesnoires[]=$numeropage;
                }else{
                    $couleur++;
                    $pagescouleurs[]=$numeropage;
                }
            }

        }
        $o->listepagescouleurs=implode(",",$pagescouleurs);
        $o->listepagesnoires=implode(",",$pagesnoires);
        $o->listepagesblanches=implode(",",$pagesblanches);
        $o->totalpages = $numeropage;
        $o->pagesnoires = $noir;
        $o->pagescouleurs = $couleur;
        $o->pagesblanches = $blanche;
    }
    return json_encode($o);
}

Ubuntu 14.04 se bloque sous hyper-v

prompt

A l’instar de Windows, Ubuntu 14.04 comporte des « fonctionnalités »… appellé « bug » par le commun des mortels. 🙂
Ubuntu 14.04 virtualisé sous hyper-v, au bout d’un certain temps « gèle » aléatoirement. Le noyau 3.13 serait en cause ce qui explique pourquoi ubuntu 12.04LTS n’a pas ce problème.

 

 

La solution en attendant un correctif du noyau  (Edit du 17/10: ce problème est aujourd’hui réglé):

cd /etc/default
sudo vi grub

ajouter "nohz=off elevator=deadline transparent_hugepage=always" dans les paramètres de la ligne "GRUB_CMDLINE_LINUX_DEFAULT"

sauvegardez puis faire:

sudo update-grub

Ensuite dans le fichier /etc/sysctl.conf

Ajouter les lignes suivante

kernel.sched_min_granularity_ns=10000000
kernel.sched_wakeup_granularity_ns=15000000
vm.dirty_ratio=10
vm.dirty_background_ratio=5
vm.swappiness=10

Sauvegardez puis redémarrez

=> le système devrait être plus stable.

 

Modification du 9 Mai 2015:

Dans sa distribution 14.04.2, Ubuntu distribue le noyau 3.16. Celui bénéfie d’une meilleur integration dans un Hyper-v sous windows 2012r2. (Windows ne signale plus l’intégration comme dégradée). Pour en bénéficier, il suffit d’installer ce noyau en utilisant la commande:

sudo apt-get install linux-image-generic-lts-utopic

Trouver les derniers enregistrements dans un groupement sans LAST en MySQL

logo-mysql-110x57Mysql ne comporte pas fonction last et lorsque l’on fait un groupement, on ne peut récupérer les derniers enregistrements sur la base d’un regroupement.

 

Dans un de mes développement, j’avais les coordonnées de destinataire intégrée dans une table nommée commandes. (pour éviter une table supplémentaire dans un schéma déjà complexe)

La difficulté était de récupérer la liste des destinataires avec leurs coordonnées les plus récente. Ces dernières se trouvent dans la dernière commande passée pour chaques destinataires.

Une requête SQL telle que:

select numero_client, nom,prenom,adresse,codepostal, ville from commandes group by numero_client

ne récupère pas le dernier enregistrement.Hors si le destinataire a changé de nom ou d’adresse, cela pose problème.

On peut contourner le problème par une requête en deux temps:

select numero_client, nom,prenom,adresse,codepostal, ville from commandes where id in (select max(id) from commandes group by numero_client)

La 1ere partie de la requête select max(id) from commandes group by numero_client va établir une liste des id de la dernière commande pour chaque client.Ensuite la seconde partie de la requête va sélectionner les lignes correspondantes à la liste d’id précédemment créé.

Cela permet de contourner le problème de l’absence de l’instruction last.