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...