Mini-app pour nettoyer les métadonnées d’un PDF sous Arch/XFCE

l’Almanet doLys Gnu/Linux – Open Source – Entreprises Forums L’almanet doLys Open Source Mini-app pour nettoyer les métadonnées d’un PDF sous Arch/XFCE

  • This topic is empty.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Articles
  • #13354
    nam1962nam1962
    Keymaster

      Vous voulez un PDF tout propre qui n’indique pas que vous l’avez créé à 2 h du matin, en le scannant sur l’imprimante de votre cousin depuis une feuille de calcul ?

      Les nettoyeurs de métadonnées graphiques existent, mais certains prennent le marteau-pilon : ils rasterisent le PDF, suppriment la couche texte et transforment parfois quelques dizaines de kilo-octets en un gros pseudo-scan.

      Ici, ExifTool supprime les métadonnées et qpdf réécrit le fichier sans dégrader le document. L’original reste à sa place.

      1. Installer les trois outils

      Sous Arch Linux ou EndeavourOS :

      sudo pacman -S qpdf perl-image-exiftool zenity

      zenity sert uniquement à obtenir une petite fenêtre de sélection de fichiers. Pas besoin de lancer un terminal à chaque fois.

      2. Créer la mini-app

      Créez le fichier :

      mkdir -p ~/.local/bin
      nano ~/.local/bin/pdfclean-safe

      Et collez ceci :

      #!/usr/bin/env bash
      set -euo pipefail
      
      EXIFTOOL="$(command -v exiftool || true)"
      
      if [[ -z "$EXIFTOOL" && -x /usr/bin/vendor_perl/exiftool ]]; then
          EXIFTOOL=/usr/bin/vendor_perl/exiftool
      fi
      
      QPDF="$(command -v qpdf || true)"
      
      if [[ -z "$EXIFTOOL" || -z "$QPDF" ]]; then
          zenity --error \
              --title="PDFClean Safe" \
              --text="Il manque qpdf ou ExifTool."
          exit 1
      fi
      
      unique_output() {
          local in="$1"
          local stem="${in%.*}"
          local out="${stem}.clean.pdf"
          local n=2
      
          while [[ -e "$out" ]]; do
              out="${stem}.clean-${n}.pdf"
              ((n++))
          done
      
          printf '%s\n' "$out"
      }
      
      if (($#)); then
          files=("$@")
      else
          selection="$(
              zenity \
                  --file-selection \
                  --multiple \
                  --separator=$'\n' \
                  --file-filter="PDF | *.pdf *.PDF" \
                  --title="Choisir les PDF à nettoyer"
          )" || exit 0
      
          mapfile -t files <<< "$selection"
      fi
      
      success=()
      failed=()
      
      for in in "${files[@]}"; do
      
          if [[ ! -f "$in" || "${in,,}" != *.pdf ]]; then
              failed+=("$in")
              continue
          fi
      
          out="$(unique_output "$in")"
          tmp="$(mktemp --suffix=.pdf)"
      
          cp -- "$in" "$tmp"
      
          before="$("$QPDF" --show-npages "$in" 2>/dev/null || true)"
      
          if ! "$EXIFTOOL" \
              -overwrite_original \
              -all= \
              "$tmp" >/dev/null 2>&1
          then
              rm -f -- "$tmp"
              failed+=("$in")
              continue
          fi
      
          if ! "$QPDF" \
              --remove-info \
              --remove-metadata \
              --object-streams=generate \
              "$tmp" "$out" 2>/dev/null
          then
              rm -f -- "$tmp" "$out"
              failed+=("$in")
              continue
          fi
      
          rm -f -- "$tmp"
      
          after="$("$QPDF" --show-npages "$out" 2>/dev/null || true)"
      
          if [[ -n "$before" && -n "$after" && "$before" != "$after" ]]; then
              rm -f -- "$out"
              failed+=("$in")
              continue
          fi
      
          if ! "$QPDF" --check "$out" >/dev/null 2>&1; then
              rm -f -- "$out"
              failed+=("$in")
              continue
          fi
      
          success+=("$out")
      done
      
      message=""
      
      if ((${#success[@]})); then
          message+="PDF nettoyé(s) :\n\n"
      
          for f in "${success[@]}"; do
              message+="• $f\n"
          done
      fi
      
      if ((${#failed[@]})); then
          message+="\nÉchec(s) :\n"
      
          for f in "${failed[@]}"; do
              message+="• $f\n"
          done
      fi
      
      if ((${#failed[@]})); then
          zenity --warning \
              --title="PDFClean Safe" \
              --text="$message" \
              --width=600
      else
          zenity --info \
              --title="PDFClean Safe" \
              --text="$message" \
              --width=600
      fi

      Puis rendez-le exécutable :

      chmod +x ~/.local/bin/pdfclean-safe

      3. Ajouter le lanceur XFCE

      mkdir -p ~/.local/share/applications
      
      cat > ~/.local/share/applications/pdfclean-safe.desktop <<EOF
      [Desktop Entry]
      Type=Application
      Name=PDFClean Safe
      Comment=Nettoyer les métadonnées d'un PDF sans le rasteriser
      Exec=$HOME/.local/bin/pdfclean-safe %F
      Icon=application-pdf
      Terminal=false
      Categories=Utility;Office;
      MimeType=application/pdf;
      StartupNotify=true
      EOF
      
      chmod +x ~/.local/share/applications/pdfclean-safe.desktop

      Le programme apparaît alors dans le menu des applications XFCE. Un clic ouvre directement la fenêtre de sélection des PDF.

      4. Mettre également un raccourci sur le Bureau

      desktop="$(xdg-user-dir DESKTOP)"
      
      cp ~/.local/share/applications/pdfclean-safe.desktop \
         "$desktop/PDFClean Safe.desktop"
      
      chmod +x "$desktop/PDFClean Safe.desktop"
      
      gio set \
          "$desktop/PDFClean Safe.desktop" \
          metadata::trusted true 2>/dev/null || true

      Vous avez maintenant votre gros bouton « nettoie-moi ça » sur le Bureau.

      5. Utilisation

      Sélectionnez un ou plusieurs PDF. Pour :

      rapport.pdf

      l’application produit :

      rapport.clean.pdf

      Si ce fichier existe déjà :

      rapport.clean-2.pdf
      rapport.clean-3.pdf
      ...

      L’original n’est jamais modifié.

      Métadonnées supprimées

      La mini-app vise notamment les champs PDF/XMP du genre :

      Author
      Creator
      Producer
      CreateDate
      ModifyDate
      MetadataDate
      DocumentID
      InstanceID
      OriginalDocumentID

      Ce sont les petites miettes qui peuvent raconter que le document vient de Word, LibreOffice, Firefox, tel scanner, tel profil utilisateur ou tel logiciel ou poste qui a produit le PDF.

      Limites

      La mini-app ne rasterise pas le document. Un PDF contenant du vrai texte doit conserver son vrai texte : recherche, copier-coller, accessibilité et qualité d’impression restent intactes. Elle n’efface évidemment pas les traces externes au PDF, comme les dates du système de fichiers, et le nom que vous donnez au fichier reste visible.

      On nettoie le PDF, on ne le détruit pas.

      Pour les curieux : vérifier avant et après

      exiftool -a -u -G1 document.pdf
      
      exiftool -a -u -G1 document.clean.pdf
      
      qpdf --check document.clean.pdf

      Et pour vérifier qu’un « nettoyeur » ne vous a pas discrètement transformé le PDF en deux JPEG déguisés :

      pdffonts document.clean.pdf
      pdfimages -list document.clean.pdf

      Un peu de paranoïa technique ne nuit pas — surtout quand le « nettoyeur » transforme 50 ko de PDF en 500 ko d’images.

      Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc

    Affichage de 1 message (sur 1 au total)
    • Vous devez être connecté pour répondre à ce sujet.