Concaténer des fichiers PDF

5 05 2009

Voici un script Nautilus qui permet de concaténer des fichiers PDF en un seul fichier. Comme le précédent, il utilise Python et Zenity. La différence réside dans l’utilisation de pdftk, un programme en ligne de commande, véritable couteau suisse du PDF !

Pré-requis

Une installation standard d’Ubuntu Jaunty.

Le seul paquet à installer est PDFTk :

sudo apt-get install pdftk

Le script utilise aussi zenity mais il est installé en standard.

Téléchargement

Télécharger le script Concaténation de fichiers PDF

Installation

Copier le fichier contenant le script dans le répertoire ~/.gnome2/nautilus-scripts

Vous pouvez changer le nom du script à votre convenance en gardant à l’esprit qu’il doit commencer par une majuscule. Il doit également avoir des droits d’exécution.

Utilisation

  1. Sélectionner les PDF à concaténer dans Nautilus
  2. Appeler le menu contextuel sur cette sélection (clic droit de la souris) et sélection Scripts → Concaténation de fichiers PDF
  3. Indiquer le nom du fichier de destination
  4. Le PDF se génère rapidement

Note : les scripts Nautilus n’ont pas accès à l’ordre dans lequel les fichiers ont été sélectionnés. Il faut que les fichiers soient triés par ordre alphabétique. Par exemple, les fichiers un.pdf, deux.pdf et trois.pdf seront concaténer dans l’ordre suivante : deux.pdf, trois.pdf, un.pdf.

Pour remédier à cela, il suffit de renommer les fichiers 01-un.pdf, 02-deux.pdf, 03-trois.pdf pour faire la concaténation dans l’ordre voulu.

Développement

Ce script a été développé en Python. Il utilise plusieurs facilités :

  • Interfaçage avec le système de script de Nautilus
  • Utilisation de Zenity (nom de fichier destination, messages d’erreur)
  • Utilisation de PDFTk

PDFTk

Comme présenté plus tôt, PDFTk est un couteau suisse du PDF. Hormis l’inconvénient d’être en ligne de commande, il a le défaut de ne pas supporter les noms de fichier contenant des espaces ou des caractères accentués.

L’astuce consiste à créer des copies des fichiers PDF dans des fichiers temporaires. En Python, cela donne :

tmp=NamedTemporaryFile()
copyfile(source,tmp.name)

Il n’est pas nécessaire de supprimer explicitement les fichiers temporaires ainsi créés : leur création est encapsulée dans un objet et c’est la destruction de cet objet qui entrainera la suppression des fichiers sur le disque. Il faut, par contre, veiller à ce que l’objet soit toujours référencé par une variable le temps du traitement.

Code source

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from os import getenv
from subprocess import Popen,PIPE,call,check_call
from tempfile import NamedTemporaryFile
from shutil import copyfile

"""
Pré-requis :
- pdftk
- Zenity
"""

# Copie les PDFs dans des fichiers temporaires
# pdftk ne supporte pas les noms de fichiers accentués, on utilise des fichiers
# temporaires pour cela
pdfs      =getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS","").splitlines()
copies    =[]
tmpentrees=[]

for pdf in pdfs:
    filetype=Popen(["file","-b","-i",pdf],stdout=PIPE).communicate()[0].strip()

 # Prend en compte le fichier seulement si c'est un PDF
 if filetype.startswith("application/pdf"):
    tmpentree=NamedTemporaryFile()
    copyfile(pdf,tmpentree.name)
    copies.append(tmpentree)
    tmpentrees.append(tmpentree.name)

if len(tmpentrees)==0:
    call(["zenity","--error","--text","Aucun fichier sélectionné !"])
    exit(1)

if len(tmpentrees)==1:
    call(["zenity","--error","--text","Un seul fichier sélectionné !"])
    exit(1)

# Effectue la concaténation des fichiers PDF
tmpsortie=NamedTemporaryFile()

nomsortie=Popen(["zenity","--file-selection","--title","Fichier destination","--save","--confirm-overwrite"],stdout=PIPE).communicate()[0].strip()

if nomsortie=="":
    call(["zenity","--error","--text","Aucun nom de fichier saisi !"])
    exit(2)

try:
    check_call(["pdftk"]+tmpentrees+["cat","output",tmpsortie.name])

    copyfile(tmpsortie.name,nomsortie)
except:
    call(["zenity","--error","--text","Erreur lors de la concaténation"])
    exit(3)

Actions

Information

2 responses

3 11 2011
Philippe

J’ai essayé votre script, lorsque je sélectionne trois fichiers, et le script me renvoie aucun fichier sélectionné, une idée?

Merci d’avance.

Philippe

3 11 2011
zigazou

Bonjour,

Je viens de réessayer le script sur une version récente d’Ubuntu et j’ai pu constater le bug dont vous parlez.

J’ai corrigé le script en conséquence. Le bug était causé par une mise à jour de l’utilitaire “file” utilisé ligne 21 pour vérifier que les fichiers soumis sont des fichiers PDF.

Le test que j’utilisais attendais la valeur “application/pdf” mais les dernières versions de “file” sont plus précises et peuvent retourner des valeurs comme “application/pdf;charset=binary”. La correction a consisté à regarder si la chaîne retournée commence par “application/pdf”

Cordialement

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s




%d blogueurs aiment cette page :