diff --git a/desktop/md-to-print-print.desktop b/desktop/md-to-print-print.desktop index 42fa766..e7c62ec 100644 --- a/desktop/md-to-print-print.desktop +++ b/desktop/md-to-print-print.desktop @@ -10,7 +10,7 @@ TargetContext=true Enabled=true [X-Action-Profile profile-zero] -Exec=md_to_print_gui.sh --print %F +Exec=sh -c 'DISPLAY="${DISPLAY:-:0}" md_to_print_gui.sh --print %F' MimeTypes=text/markdown;text/x-markdown; MatchPattern=*.md;*.markdown;*.mkd; Name=Default profile diff --git a/md_to_print.sh b/md_to_print.sh index 97b418a..1d2ebcf 100755 --- a/md_to_print.sh +++ b/md_to_print.sh @@ -535,8 +535,11 @@ fi PANDOC_OPTS=( "$MD_FILE" + --from=markdown # Format d'entrée explicite (Markdown) + --to=pdf # Format de sortie explicite (PDF) -o "$PDF_FILE" --pdf-engine="$PDF_ENGINE" + --standalone # Document complet avec métadonnées -V geometry:margin=2cm -V fontsize=11pt -V documentclass=article @@ -551,9 +554,11 @@ if [ "$PDF_ENGINE" = "xelatex" ]; then ) fi -if [ "$ORIENTATION" = "landscape" ]; then - PANDOC_OPTS+=(-V geometry:landscape) -fi +# Ne pas forcer l'orientation dans le PDF - laisser CUPS gérer l'orientation lors de l'impression +# Cela évite les conflits de mise en page +# if [ "$ORIENTATION" = "landscape" ]; then +# PANDOC_OPTS+=(-V geometry:landscape) +# fi log DEBUG "Exécution: pandoc ${PANDOC_OPTS[*]}" @@ -600,12 +605,17 @@ if [ -n "$PAGES" ]; then LP_OPTS+=(-o page-ranges="$PAGES") fi +# Appliquer l'orientation via CUPS (le PDF reste en portrait) +# Utiliser les valeurs standard IPP pour l'orientation if [ "$ORIENTATION" = "landscape" ]; then LP_OPTS+=(-o orientation-requested=4) fi LP_OPTS+=(-o media="$SIZE") +# Ne pas utiliser fit-to-page car cela peut causer des problèmes de mise en page +# Le PDF est déjà correctement dimensionné + case "$QUALITY" in draft) LP_OPTS+=(-o print-quality=3) diff --git a/scripts/md_to_print_gui.sh b/scripts/md_to_print_gui.sh index ece346d..ef35276 100755 --- a/scripts/md_to_print_gui.sh +++ b/scripts/md_to_print_gui.sh @@ -66,37 +66,60 @@ show_print_options() { fi fi - # Dialogue zenity avec formulaire - local result=$(zenity --forms --title "Options d'impression MD_to_Print" \ + # Dialogue zenity avec formulaire (forcer DISPLAY et mode synchrone) + echo "DEBUG show_print_options: Tentative d'affichage avec DISPLAY=${DISPLAY}" >> /tmp/md_to_print_debug.log + + local result + # Utiliser dbus-launch si nécessaire pour les applications GUI depuis un contexte non-GUI + if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] && command -v dbus-launch &> /dev/null; then + eval $(dbus-launch --sh-syntax) + fi + + result=$(DISPLAY="${DISPLAY}" zenity --forms \ + --title "Options d'impression MD_to_Print" \ --text "Configurez les options d'impression" \ --add-combo "Imprimante" \ --combo-values "$printers" \ - --set-value "Par défaut" \ --add-combo "Recto-verso" \ --combo-values "none|simplex|duplex" \ - --set-value "none" \ --add-entry "Nombre de copies (1-10)" \ - --set-value "1" \ --add-combo "Couleur" \ --combo-values "Non|Oui" \ - --set-value "Non" \ --add-combo "Qualité" \ --combo-values "draft|normal|high" \ - --set-value "normal" \ --add-combo "Orientation" \ --combo-values "portrait|landscape" \ - --set-value "portrait" \ - 2>/dev/null) + 2>&1) - if [ $? -ne 0 ] || [ -z "$result" ]; then - return 1 # Utilisateur a annulé + local zenity_exit=$? + echo "DEBUG show_print_options: zenity_exit=$zenity_exit, result=$result" >> /tmp/md_to_print_debug.log + + # Code 1 = utilisateur a annulé (normal) + # Code 0 = OK + # Autre = erreur + if [ $zenity_exit -eq 1 ]; then + # Utilisateur a annulé + echo "DEBUG: Utilisateur a annulé le dialogue" >> /tmp/md_to_print_debug.log + return 1 + elif [ $zenity_exit -ne 0 ]; then + # Erreur d'exécution + echo "Erreur zenity (code $zenity_exit): $result" >> /tmp/md_to_print_zenity_error.log + echo "DEBUG: Erreur zenity (code $zenity_exit): $result" >> /tmp/md_to_print_debug.log + return 1 fi + if [ -z "$result" ]; then + echo "DEBUG: Résultat vide" >> /tmp/md_to_print_debug.log + return 1 # Pas de résultat + fi + + echo "DEBUG: Dialogue réussi, résultat: $result" >> /tmp/md_to_print_debug.log + # Parser les résultats (zenity forms retourne les valeurs séparées par |) IFS='|' read -r selected_printer duplex_mode copies color quality orientation <<< "$result" - # Valider et formater les options - PRINT_OPTS=() + # Valider et formater les options (déclarer comme globale) + declare -ga PRINT_OPTS=() if [ -n "$selected_printer" ] && [ "$selected_printer" != "Par défaut" ] && [ "$selected_printer" != "" ]; then PRINT_OPTS+=(--printer "$selected_printer") @@ -291,6 +314,45 @@ if [ ${#MD_FILES[@]} -gt 1 ]; then fi fi +# Afficher le dialogue d'options d'impression AVANT le traitement si action print et un seul fichier +# (doit être fait depuis l'hôte, pas dans Docker) +PRINT_OPTS=() + +# S'assurer que DISPLAY est défini (nécessaire quand appelé depuis Caja Actions) +if [ -z "${DISPLAY:-}" ]; then + # Essayer de trouver DISPLAY depuis l'environnement utilisateur + if [ -f "$HOME/.Xauthority" ] && [ -S "/tmp/.X11-unix/X0" ]; then + export DISPLAY=":0" + elif [ -S "/tmp/.X11-unix/X0" ]; then + export DISPLAY=":0" + fi + # Dernière tentative : utiliser la valeur par défaut + if [ -z "${DISPLAY:-}" ]; then + export DISPLAY=":0" + fi +fi + +# Logs de débogage +echo "DEBUG: ACTION=$ACTION" >> /tmp/md_to_print_debug.log +echo "DEBUG: DISPLAY=${DISPLAY:-}" >> /tmp/md_to_print_debug.log +echo "DEBUG: zenity disponible: $(command -v zenity 2>&1)" >> /tmp/md_to_print_debug.log +echo "DEBUG: Nombre de fichiers: ${#MD_FILES[@]}" >> /tmp/md_to_print_debug.log + +# Afficher le dialogue d'options pour print ET preview (si un seul fichier) +if [ \( "$ACTION" = "print" -o "$ACTION" = "preview" \) ] && command -v zenity &> /dev/null && [ ${#MD_FILES[@]} -eq 1 ]; then + echo "DEBUG: Conditions remplies, tentative d'affichage du dialogue" >> /tmp/md_to_print_debug.log + # Toujours essayer d'afficher le dialogue pour print et preview + if show_print_options; then + echo "DEBUG: Dialogue OK, options: ${PRINT_OPTS[*]}" >> /tmp/md_to_print_debug.log + notify info "Options sélectionnées: ${PRINT_OPTS[*]}" + else + echo "DEBUG: Dialogue échoué ou annulé" >> /tmp/md_to_print_debug.log + notify info "Utilisation des options par défaut" + fi +else + echo "DEBUG: Conditions non remplies - ACTION=$ACTION, zenity=$(command -v zenity), fichiers=${#MD_FILES[@]}" >> /tmp/md_to_print_debug.log +fi + # Notification de début notify info "Traitement de ${#MD_FILES[@]} fichier(s)..." @@ -315,18 +377,15 @@ for file in "${MD_FILES[@]}"; do if [ "$ACTION" = "convert" ]; then docker_args+=(--convert-only) elif [ "$ACTION" = "preview" ]; then + # Pour "preview", utiliser les options déjà récupérées avant la boucle + if [ ${#PRINT_OPTS[@]} -gt 0 ]; then + docker_args+=("${PRINT_OPTS[@]}") + fi docker_args+=(--preview --keep-pdf) else - # Pour "print", afficher le dialogue d'options si disponible - if command -v zenity &> /dev/null && [ ${#MD_FILES[@]} -eq 1 ]; then - # Afficher le dialogue d'options pour un seul fichier - if show_print_options; then - docker_args+=("${PRINT_OPTS[@]}") - notify info "Options: ${PRINT_OPTS[*]}" - else - # Utiliser les valeurs par défaut si l'utilisateur annule - notify info "Utilisation des options par défaut" - fi + # Pour "print", utiliser les options déjà récupérées avant la boucle + if [ ${#PRINT_OPTS[@]} -gt 0 ]; then + docker_args+=("${PRINT_OPTS[@]}") fi # On garde le PDF après impression docker_args+=(--keep-pdf) @@ -344,6 +403,21 @@ for file in "${MD_FILES[@]}"; do "${docker_args[@]}" \ > /tmp/md_to_print_docker.log 2>&1; then SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) + + # Pour preview, ouvrir le PDF depuis l'hôte après conversion + if [ "$ACTION" = "preview" ]; then + pdf_file="$output_dir/${file_base%.*}.pdf" + if [ -f "$pdf_file" ]; then + if command -v evince &> /dev/null; then + evince "$pdf_file" 2>/dev/null & + elif command -v xdg-open &> /dev/null; then + xdg-open "$pdf_file" 2>/dev/null & + else + notify warn "Aucun visualiseur PDF trouvé pour prévisualisation" + fi + fi + fi + notify success "✓ $file_name traité" else ERROR_COUNT=$((ERROR_COUNT + 1)) @@ -363,16 +437,9 @@ for file in "${MD_FILES[@]}"; do case "$ACTION" in print) - # Pour print, afficher le dialogue d'options si disponible - if command -v zenity &> /dev/null && [ ${#MD_FILES[@]} -eq 1 ]; then - # Afficher le dialogue d'options pour un seul fichier - if show_print_options; then - cmd_args+=("${PRINT_OPTS[@]}") - notify info "Options: ${PRINT_OPTS[*]}" - else - # Utiliser les valeurs par défaut si l'utilisateur annule - notify info "Utilisation des options par défaut" - fi + # Pour print, utiliser les options déjà récupérées avant la boucle + if [ ${#PRINT_OPTS[@]} -gt 0 ]; then + cmd_args+=("${PRINT_OPTS[@]}") fi # On garde le PDF après impression cmd_args+=(--keep-pdf) @@ -382,12 +449,40 @@ for file in "${MD_FILES[@]}"; do cmd_args+=(--convert-only) ;; preview) + # Pour preview, utiliser les options déjà récupérées avant la boucle + if [ ${#PRINT_OPTS[@]} -gt 0 ]; then + cmd_args+=("${PRINT_OPTS[@]}") + fi cmd_args+=(--preview --keep-pdf) ;; esac if "$script_path" "${cmd_args[@]}" > /tmp/md_to_print.log 2>&1; then SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) + + # Pour preview, ouvrir le PDF depuis l'hôte après conversion + if [ "$ACTION" = "preview" ]; then + # Chercher le PDF dans le répertoire de sortie + pdf_file="" + if [ -f "${file%.*}.pdf" ]; then + pdf_file="${file%.*}.pdf" + elif [ -f "$HOME/MD_to_print_output/$(basename "${file%.*}.pdf")" ]; then + pdf_file="$HOME/MD_to_print_output/$(basename "${file%.*}.pdf")" + elif [ -f "./output/$(basename "${file%.*}.pdf")" ]; then + pdf_file="./output/$(basename "${file%.*}.pdf")" + fi + + if [ -n "$pdf_file" ] && [ -f "$pdf_file" ]; then + if command -v evince &> /dev/null; then + evince "$pdf_file" 2>/dev/null & + elif command -v xdg-open &> /dev/null; then + xdg-open "$pdf_file" 2>/dev/null & + else + notify warn "Aucun visualiseur PDF trouvé pour prévisualisation" + fi + fi + fi + notify success "✓ $file_name traité" else ERROR_COUNT=$((ERROR_COUNT + 1))