Impression PDF sur serveur de fichiers .doc et .ppt

Bonjour tout le monde,

Après quelques semaines de tests et de recherches je viens vous demander votre aide pour un problème d’impression PDF.

J’ai un serveur avec une Debian Lenny, cups et cups-pdf installés. Après pas mal d’essais j’ai réussi à imprimer correctement dans un fichier PDF des documents .txt et .jpg (par une simple commande lp, et une configuration ad hoc), mais impossible de faire fonctionner le système avec d’autres fichiers (notamment .doc et .ppt) ; je me retrouve toujours avec des pdf vides de 2kb, sans qu’aucune erreur n’ait été affichée.

J’ai essayé pas mal de choses : cups-pdf, des backends customisés, ps2pdf (mais je ne crois pas avoir compris comment le faire fonctionner correctement…), et toutes ces méthodes me donnent le même fichier vide.

J’ai même essayé a2ps puis une impression, mais si mes .txt passent bien, mes .doc et .ppt en revanche ressortent comme des pdfs énormes remplis de caractère incompréhensibles, et ce quel que soit l’encodage que je tente d’utiliser.

Je fonctionne en ce moment avec un tuto que j’ai trouvé ici novell.com/coolsolutions/feature/17636.html, donc un fichier backend, et idem, aucun .doc ni .ppt ne passent.

Voici mon /etc/cups/cupsd.conf :

[code]LogLevel warning
SystemGroup lpadmin

Allow remote access

Port 631
Listen /var/run/cups/cups.sock

Show shared printers on the local network.

Browsing On
BrowseOrder allow,deny
BrowseAllow all
DefaultAuthType Basic

Allow From All

Allow remote administration…

Order allow,deny
Allow all

<Location /admin>
Allow From All

Allow remote administration…

Order allow,deny
Allow all

<Location /admin/conf>
Allow From All
AuthType Default
Require user @SYSTEM

Allow remote access to the configuration files…

Order allow,deny
Allow all



Require user @OWNER @SYSTEM
Order deny,allow


AuthType Default
Require user @SYSTEM
Order deny,allow


AuthType Default
Require user @SYSTEM
Order deny,allow


Require user @OWNER @SYSTEM
Order deny,allow


Order deny,allow


[/code]

Et le fichier backend que j’utilise, /usr/lib/cups/backend/pdf-writer :

[code]#!/bin/sh
################################################################################

File: pdf-writer

Description: A simple PDF Writer for CUPS

Copyright: © 2006 Axel Schmidt, SUSE LINUX GmbH, Nuernberg, Germany

© 2001 Michael Goffioul (kdeprint swing be)

License: GPL

################################################################################

PS2PDF=which ps2pdf
DATE=date +%Y-%m-%d-%H:%M.%S

USERMODE=“on” changes PDFPATH to “$HOME//PDF”

USERMODE="off"
DEFGROUP=“users"
HOME=”/home"
JOB=$1
PRTUSER=$2

Create user based file name

create_user_fname()
{
if [ “$PRTUSER” != “” ]; then
FILENAME="$PDFPATH/$PRTUSER-$DATE.pdf"
logger “pdf-writer: “$PRTUSER-$DATE.pdf” was placed in: $PDFPATH"
else
FILENAME=”$PDFPATH/$DATE.pdf"
logger "pdf-writer: “$DATE.pdf” was placed in: $PDFPATH"
fi
}

Check DEVICE DISCOVERY + test PS2PDF

if [ “$JOB” = “” ]; then
if test -f “$PS2PDF” ; then
echo "network pdf-writer:/export/share/pdf “unkown” “pdf writer” “
logger “pdf-writer: INFO: USERMODE=”$USERMODE”"
if [ “$USERMODE” = “on” ]; then
logger "pdf-writer: CUPS user must be set to root with USERMODE=“on”!"
fi
exit 0
else
echo "Error: $0 - ps2pdf is not available!"
logger "pdf-writer: ERROR: ps2pdf is not available!"
exit 1
fi
fi

logger “pdf-writer started: $1 $2 $3 $4 $5 $6”

Check number of command line arguments

if [ $# -ne 5 -a $# -ne 6 ]; then
echo "Usage: $0 job-id user title copies options [file]"
logger "pdf-writer: CRITICAL: Printer stopped !"
exit 1
fi

get PDF-WRITER directory from device URI

PDFPATH=${DEVICE_URI#pdf-writer:}

Create output filename based on user name and user mode

if [ “$USERMODE” = “on” -a “$PRTUSER” != “” ]; then
mkdir -p $HOME/$PRTUSER/PDF
chown $PRTUSER $HOME/$PRTUSER/PDF

check if cups run as lp or root

user lp may not run chown

    if [ $? -eq 1 ]; then
            create_user_fname
    else
            chgrp $DEFGROUP /home/$PRTUSER/PDF
            PDFPATH=$HOME/$PRTUSER/PDF
            FILENAME="$PDFPATH/$DATE.pdf"
            logger "pdf-writer: \"$DATE.pdf\" was placed in: $PDFPATH"
    fi

else
create_user_fname
fi

Check write status

if [ ! -d “$PDFPATH” -o ! -w “$PDFPATH” ]; then
logger "pdf-writer: ERROR: directory $PDFPATH not writeable"
exit 1
fi

Run ps2pdf (ghostscript)

if [ $# -eq 6 ]; then
$PS2PDF $6 $FILENAME >& /dev/null
else
$PS2PDF - $FILENAME >& /dev/null
fi

Chown + set permissions for the user

Note: this will no work if CUPS runs as lp

if [ “$PRTUSER” != “” ]; then
chmod 644 $FILENAME
chown $PRTUSER:$DEFGROUP $FILENAME
fi
exit 0

######################### CUPS pdf-writer ends here ########################
#[/code]

Merci d’avance de votre aide et/ou de vos conseils, et désolé s’ils manquent des éléments pour la bonne compréhension du problème, n’hésitez pas à demander des détails.

pas avec cups ou cup-pdf mais le Paquet unoconv. cet outil sait manipuler tous les formats gérés par openoffice et via la ligne de commande donc il sait transformer un .doc en .pdf.

[i]This package provides a commandline utility which can convert from any document format that OpenOffice can import to any document format it can export. It uses OpenOffice’s UNO bindings for non-interactive conversion of documents.

Supported document formats include Open Document format, MS Word, MS Office Open/MS OOXML, PDF, HTML, XHTML, RTF, Docbook, and more. [/i]

en fait il est possible dans ton script que selon les extension de tes fichiers sources tu soit amené à utiliser differents outils pour les transformer en pdf.

Je ne suis pas en mesure de tester avant une semaine, mais merci beaucoup du tuyau, je regarderai ça.

A très bientôt donc, merci encore !

Merci Thomas, ta solution était la bonne.

Pour ceux que ça peut aider, voici comment j’ai fait sur mon serveur Debian Lenny :
Utilisation de unoconv avec Open Office : paquets
[ul]openoffice.org
openoffice.org-headless pour se passer d’interface X
openoffice.org-calc pour les tableurs
openoffice.org-writer pour les documents textes
openoffice.org-writer pour les présentations
openoffice.org-draw pour les images
openoffice.org-math pour les formules mathématiques
unoconv
python-uno pour lier OOo et unoconv[/ul]

Et pour la commande, un simple unoconv /chemin/du/fichier transforme ce que vous voulez en PDF (par défaut). On peut aussi transformer en n’importe quel autre format supporté. Plus de détails sur unoconv ici : dag.wieers.com/home-made/unoconv/.