Impression d’un document PDF sur une imprimante PCL

17.06.2005 | marcori
3345 visiteurs  -  4 visiteurs aujourd'hui  -  1 commentaire

Convertir un fichier PDF en PCL

J’ai dernièrement été confronté à un dilemne. Comment faire pour imprimer rapidement un gros fichier PDF sur une imprimante qui ne connait que le PCL ou le postscript ?

Eh oui, la contrainte tiens dans le mot rapidement. Car envoyer un fichier PDF à une imprimante postscript ne pose pas de problème, sauf que l’interprétation faite par l’imprimante est d’une lenteur accablante. Il faut donc convertir le fichier PDF en PCL.

Pour cela il existe un merveilleux outil appelé ghostscript qui convertit du postscript ou du PDF en a peu près n’importe quoi !

Parmi les contraintes que j’ai pu rencontrer :
-  Imprimer un document PDF au format paysage (landscape). Mine de rien, c’est une grosse difficulté, et j’ai du abandonner mon amour pour les logiciels libres pour y ajouter une couche propriétaire avec Acrobat Reader. Ce script utilise donc Acrobat Reader en version 5 pour pouvoir fonctionner. Cela étant, l’utilisation faite d’Acrobat Reader se restreind ici à un parseur de fichier PDF en fichier Postscript, et cela ne nécessite pas l’installation d’un serveur X.
-  Imprimer sur des imprimantes gérant soit du PCL5 soit du PCL6.

En gros comme en détail, voici le script :


#!/bin/sh

################################################################################
# Script:        printpdf2pcl
# Fonction:        Convert PDF to PCL
#
# Auteur:        Marc-Henri PAMISEUX
#                 Libricks.org
# Version:        1.0
# Date:                17/06/2005
#
# Dépendance:        Ghostscript
#                Acrobat Reader 5 (Version 7 pas testée)
#
# ToDo:                - Ajouter des paramètres avec des options courtes ou longues:
#                        -f --file=pdf_file_to_print.pdf
#                        -p --printer=printername
#                        -o --orientation=[portrait|landscape]
#                        -t --pcltype=[PCL5|PCL6]
#                - Ajouter d'autres type de conversion que le PCL
#                - Ajouter une sortie autre que vers une imprimante
#                - Ajouter une detection automatique d'acrobat reader et de sa version
#                - Ajouter une detection automatique de Ghostscript
#
################################################################################

#...............................................................................
# On vient définir les variables du programme
#...............................................................................
unset ACROREAD
export ACROREAD=/opt/acrobat5/bin/acroread
unset GS
export GS=/usr/bin/gs

#...............................................................................
# On vient tester si Acrobat Reader est installé et s'il est executable
#...............................................................................
if [ ! -x ${ACROREAD} ]
then
   echo "Acrobat Reader 5 is not installed in ${ACROREAD} !" 2>&1
   exit 1
fi

#...............................................................................
# On vient tester si Ghostscript est installé et s'il est executable
#...............................................................................
if [ ! -x ${GS} ]
then
   echo "Ghostscript is not installed in ${GS} !" 2>&1
   exit 1
fi

#...............................................................................
# Compte le nombre de paramètres (Seuls deux sont obligatoires)
#...............................................................................
if [ $# -lt 2 ]
then
   echo "Usage: `basename $0` pdf_file_to_print.pdf printername [portrait|landscape] [PCL5|PCL6]" 1>&2
   exit 1
else
   unset pdffile
   unset tmpfile
   unset pclfile
   unset printername
   unset format
   unset type

#...............................................................................
# Initialisation des paramètres:
# Premier paramètre=Nom_du_fichier.pdf
# Second paramètre=Nom de l'imprimante
# Troisième paramètre=libellé du format de page
# Quatrième paramètre=Type de language utilisé PCL5 ou PCL6
#...............................................................................
   pdffile=$1
   printername=$2

# On fixe le format par défaut à portrait
   if [ ! -z "$3" ]
   then
        format=$3
   else
        format=portrait
   fi

# On fixe le type par défaut à PCL5
   if [ ! -z "$4" ]
   then
        type=$4
   else
        type=PCL5
   fi

# On vient générer le nom du fichier postscript issu de la conversion PDF
   tmpfile=`dirname "$1"`/`basename "$1" \.pdf`.ps
   pclfile=/tmp/`basename "$1" \.pdf`.pcl
fi

#...............................................................................
# On teste l'existence du fichier à imprimer
#...............................................................................
if [ ! -s ${pdffile} ]
then
   echo "File ${pdffile} does not exist or empty." 1>&2
   exit 1
fi

#...............................................................................
# On teste l'existence de l'imprimante
#...............................................................................
unset valret
lpstat -v ${printername} 1>/dev/null 2>&1
valret=$?

if [ ${valret} -ne 0 ]
then
   echo "Printer $2 does not exist or empty." 1>&2
   exit 1
fi

# On teste si le fichier postscript n'existe pas déjà
if [ -f ${tmpfile} ]
then
        rm -f ${tmpfile}
fi

if [ -f ${pclfile} ]
then
       rm -f ${pclfile}
fi

#...............................................................................
# On vient réaliser la conversion du PDF en PS par le biais d'acrobat reader.
# Il n'y a pas d'option de sortie du fichier. Acrobat Reader génère un fichier du même
# nom que le fichier PDF mais sous l'extension .ps et dans le même dossier
#...............................................................................
if [ "${format}" = "landscape" ]
then
   ${ACROREAD} -toPostScript -${format} -size a4 ${pdffile} 1>/dev/null 2>&1
else
   ${ACROREAD} -toPostScript -size a4 ${pdffile} 1>/dev/null 2>&1
fi

#...............................................................................
# On vient vérifier que la conversion PDF->PS a bien eu lieu
#...............................................................................
if [ ! -s ${tmpfile} ]
then
   echo "An error occurs while converting ${pdffile}." 1>&2
   exit 1
fi

# On vient convertir le fichier Postscript en fichier PCL
case ${type} in
   "PCL5")
        ${GS} -q -sDEVICE=ljet4 -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -dSAFER -sOutputFile="${pclfile}" -f "${tmpfile}" 1>/dev/null 2>&1
   ;;
   "PCL6")
        ${GS} -q -sDEVICE=pxlmono -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -dSAFER -sOutputFile="${pclfile}" -f "${tmpfile}" 1>/dev/null 2>&1
   ;;
   *)
        ${GS} -q -sDEVICE=ljet4 -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -dSAFER -sOutputFile="${pclfile}" -f "${tmpfile}" 1>/dev/null 2>&1
   ;;
esac

export Flag=0
export Compteur=1

#...............................................................................
# On vient vérifier que le fichier PCL a bien été généré
#...............................................................................
if [ -s ${pclfile} ]
then
   while [ ${Flag} -eq 0 ]
   do
       lp -d${printername} ${pclfile} 1>/dev/null 2>&1
        export ValRet=$?

        if [ ${ValRet} -ne 0 ]
        then
            export Compteur=`expr ${Compteur} + 1`
            sleep 1
        else
            export Compteur=4
        fi

        if [ ${Compteur} -eq 4 ]
        then
            if [ ${ValRet} -ne 0 ]
            then
                echo -e "`date '+%Y-%m-%d %H:%M:%S'` Impression incorrecte apres ${Compteur} essais.\nCode retour de lp -d ${printername}: ${ValRet}" 2>&1
            fi
            export Flag=1
        fi
   done
   rm -f ${pclfile}
   rm -f ${tmpfile}
else
   echo "Le fichier ${pclfile} n'est pas présent. Pas d'impression" 2>&1
   rm -f ${tmpfile}
   exit 1
fi

exit 0

Comme j’ai pu l’indiquer dans la ToDoList, il reste des choses à faire...

Une pièce jointe :

Script printpdf2pcl
texte | 6.1 ko
Ce document contient le script donné dans cet article
 

1 commentaire

Impression d’un document PDF sur une imprimante PCL 26 septembre 2006 Francois

Une autre piste pour traiter les pages en landscape avec ghostscript est d’ajouter l’option suivante à la ligne de commande :

-  -c "<< /Policies << /PageSize 3 >> /PageSize [595 842] /InputAttributes currentpagedevice /InputAttributes get mark exch 1 index /Priority eq not pop << /PageSize [595 842] >> if forall >> >> setpagedevice"

Malheureusement cela ne semble pas marcher pour les pages A3 en landscape qui ne sont pas retournée !!!

Si quelqu’un a une idée...

 

Poster un nouveau commentaire


Modération de ce forum :

Ce forum est modéré à priori : votre contribution n'apparaîtra qu'après avoir été validée par un administrateur du site.


Emoticones :

(Pour insérer un émoticone, cliquez simplement sur l'image.)

:Thumbs::aime::bof::clindoeil::diable::en_colere::etoile::exclamation::fleur::interrogation::langue::lol::lunettes::mouai::pas_content::pleure_de_rire::rigolo::sourire::surprit::triste::xtra:

Titre :

Texte de votre message :

(Pour créer des paragraphes, laissez simplement des lignes vides.)


Lien hypertexte (optionnel)

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d'informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)


Qui êtes-vous ? (optionnel)


Articles les plus consultés

Téléchargez Firefox !

Libricks.org est motorisé par le logiciel libre Spip 1.8.3 associé au squelette graphique BliP 0.91

16 rubriques ... 30 articles ... 18 commentaires ... 28 sites référencés ... 50 visiteurs par jour (99041 au total)

Haut de page | XHTML 1.0 | CSS 2