Quel programme choisir?

Signaler
-
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
-
Bonjour,

Je souhaiterai rédiger un code qui me permettrait de comparer 2 documents pdf (ou word). Je sais que ça existe déjà mais j'aimerai bien le faire moi-même. Le souci est que je n'ai pratiquement jamais codé. Je suis prête à m'y mettre et à apprendre. De plus, j'ai souvent besoin dans le cadre de mon travail d'automatiser des tâches, je fais appel dans ces cas-là à des amis qui programment et souvent mon problème s'en trouve résolu, de manière rapide et efficace! Cette fois-ci, j'aimerai me lancer. J'ai donc quelques questions :
- pensez-vous que ce cas pratique (comparateur de docs) est réalisable, surtout pour une débutante comme moi?
- Si oui, quel interface ou code conviendrait le mieux?

Merci d'avance pour vos précieux conseils.

10 réponses

Messages postés
14858
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 octobre 2020
591
En fait, il y a de nombreux cours en ligne, par exemple
https://algo.developpez.com/cours/

Ensuite comparer deux pdfs ou word peut se faire avec n’importe quel langage et n’est pas trop compliqué. Donc pas la peine de s’embêter avec du C. Python par exemple est réputé facile à apprendre.
Voici un article qui peut t’aider à choisir un langage http://www.commentcamarche.net/faq/457-programmation-comment-debuter-quel-langage
Une fois choisi, tu trouveras des cours en ligne, notamment sur developpez.com
Messages postés
176
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
15 octobre 2020
9
Salut,

Voici comment j'imagine le programme.

On sépare la mise en page du texte. On compare caractère par caractère jusqu'à une différence. On peut également calculer le hash des fichiers, 2 fichiers identiques ont le même hash. N'importe quel langage possède un module de calcul de hash, je pense à Python 3 en premier.

On compare les données de mise en page des deux fichiers seulement si le hash est différent puisque dans le cas contraire les fichiers seront identiques.

Donc :

FONCTION 1 comparerHashFichiers(fi1, fi2, algoHash=sha3_256):
    ouvrir(fi1) en mode lecture binaire
    ouvrir(fi2) en mode lecture binaire
    fi1lu = lire tout de fi1
    fi2lu = lire tout de fi2
    hashf1 = hash(fi1lu)
    hashf2 = hash(fi2lu)
    fermer(fi2)
    fermer(fi1)
    SI hash(fi1lu) == hash(fi2lu):
        RETOURNER VRAI
    SINON:
        RETOURNER FAUX
    FIN SI
FIN FONCTION 1
FONCTION 2 comparerMiseEnPage(fi1, fi2):
    stats_f1 = récupérerDonnéesMiseEnPage(fi1)
    stats_f2 = récupérerDonnéesMiseEnPage(fi2)
    comparatif = stats_f1 == stats_f2
    RETOURNER stats_f1, stats_f2, comparatif // retourne un 3-tuple (une liste de stats de fi1, une liste de stats de fi2, un booléen)
FIN FONCTION 2
fichier1 = "emplacement/du/fichier1"
fichier2 = "emplacement/du/fichier2"
SI NON comparerHashFichiers(fichier1, fichier2):
stats_fichier1, stats_fichier2, comparo = comparerMiseEnPage(fichier1, fichier2)
SI NON comparo:
    afficher(stats_fichier1)
    afficher(stats_fichier2)
FIN SI
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
Salut Elea29,

Ce qu'a posté dachiasse n'est pas un programme en langage Python. C'est un programme en un pseudo langage, qui illustre un algorithme.

1.

Un "hash" est un calcul d'empreinte du fichier. Si tu as 2 fichiers rigoureusement identiques au bit près, le hash produit sera le même.

Ce cas de figure te permet de tester si un fichier .pdf est une copie d'un autre présent sous un autre nom dans le même répertoire (ou sous le même nom dans un répertoire différent).

Cette méthode ne fonctionnera pas, quand bien même le contenu textuel et le rendu visuel seraient exactement identiques, par exemple, si les deux fichiers .pdf sont produits à partir d'un même fichier d'origine, mais avec deux producteurs de fichiers .pdf différents. Ou si l'un des fichiers .pdf est compressé, ou chiffré et l'autre pas, ou si l'un comporte des annotations, des signatures électroniques incluses, ou des polices incluses et l'autre pas.

Le "hash" peut être une première méthode de comparaison.

Une autre méthode de comparaison à l'identique et qui fonctionnerait si le contenu textuel et le rendu visuel sont exactement les mêmes et indépendamment des différences mentionnées ci-dessus, consisterait à exporter chaque page des pdf sous forme d'image et à comparer les images produites.

2.

Ensuite si tu veux comparer le contenu, tu devrais extraire le texte du pdf et comparer le texte. Il y a plusieurs méthodes en Python, qui fonctionnent plus ou moins bien selon l'origine du fichier .pdf. On en parle là :

https://stackoverflow.com/questions/34837707/how-to-extract-text-from-a-pdf-file

La comparaison pourrait alors se faire au niveau du texte brut extrait, s'il est extractible (format .pdf supporté par les outils d'extraction et fichier non chiffré ou dont tu détiens la clef de déchiffrement et à condition que les outils d'extraction supportent les .pdf chiffrés).

Tu peux faire des comparaisons à l'identique du texte brut extrait ou utiliser un module comme difflib qui permettra de rapporter les différences :
https://docs.python.org/3/library/difflib.html
https://pymotw.com/2/difflib/

dans ce dernier lien, tu as des exemples de mise en oeuvre du module et de résultats de comparaisons, pour te faire une idée.

3.

En ce qui concerne la comparaison de "mise en page", je doute que l'on puisse faire quelque chose facilement, et à vrai dire, je ne suis pas sûr de comprendre de quoi on parle exactement et le type de changements qui seraient à détecter.

4.

idéalement, j'aimerai bien que ça soit indiqué directement dans le document, par un surlignage par exemple. A votre avis, c'est possible/faisable?

Cela paraît assez compliqué. Il faudrait utiliser une bibliothèque capable de parser le format pdf et d'écrire du pdf, avec des overlays. Tu auras certainement besoin de comprendre aussi un minimum la spécification du format .pdf.

Poppler est une bibliothèque C++ qui permet de faire cela : https://poppler.freedesktop.org/

Si tu utilises une telle bibliothèque, tu pourrais en parsant deux fichiers .pdf comparer le résultat du parsage, ce qui te permettrait de comparer les abstractions gérées par la bibliothèque. Cela serait une approche beaucoup plus fine et intimement liée au décodage du format .pdf et qui te permettrait de localiser très finement les différences, et de générer effectivement un .pdf de résultat montrant visuellement ces différences.

C'est ce type d'approche qu'utilise diff-pdf https://github.com/vslavik/diff-pdf qui se sert précisément de Poppler (et d'autres bibliothèques) pour faire exactement ce que tu veux faire :

https://github.com/vslavik/diff-pdf

S'il y a des modules Python faisant cela ou des wrappers Python sur Poppler offrant un degré de contrôle suffisant, je ne les connais pas.


En résumé, ce sur quoi tu te lances n'est pas vraiment un projet à la portée d'un niveau débutant.

Cela reste un projet intéressant, mais peut-être devrais tu commencer par des projets plus modestes, pour ne pas te décourager.

Dal
Messages postés
176
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
15 octobre 2020
9
Je remets le code mieux indenté :
 FONCTION 1 comparerHashFichiers(fi1, fi2, algoHash=sha3_256):
    ouvrir(fi1) en mode lecture binaire
    ouvrir(fi2) en mode lecture binaire
    fi1lu = lire tout de fi1
    fi2lu = lire tout de fi2
    hashf1 = hash(fi1lu)
    hashf2 = hash(fi2lu)
    fermer(fi2)
    fermer(fi1)
    SI hash(fi1lu) == hash(fi2lu):
        RETOURNER VRAI
    SINON:
        RETOURNER FAUX
    FIN SI
FIN FONCTION 1
FONCTION 2 comparerMiseEnPage(fi1, fi2):
    stats_f1 = récupérerDonnéesMiseEnPage(fi1)
    stats_f2 = récupérerDonnéesMiseEnPage(fi2)
    comparatif = stats_f1 == stats_f2
    RETOURNER stats_f1, stats_f2, comparatif // retourne un 3-tuple (une liste de stats de fi1, une liste de stats de fi2, un booléen)
FIN FONCTION 2
fichier1 = "emplacement/du/fichier1"
fichier2 = "emplacement/du/fichier2"
SI NON comparerHashFichiers(fichier1, fichier2):
    stats_fichier1, stats_fichier2, comparo = comparerMiseEnPage(fichier1, fichier2)
SI NON comparo:
    afficher(stats_fichier1)
    afficher(stats_fichier2)
FIN SI


"si je comprends bien, je compare d'abord le contenu des documents et ensuite je compare la mise en page." Oui c’est cela. Mais tu te le gères comme tu veux. L’ordinateur exécute le code dans l’ordre de lecture. J’ai d’abord conçu les fonctions, leur ordre n’est pas important. Ensuite il y a l’appel des fonctions et à ce moment elle s’exécute.

"je peux faire appel à la 2e étape si et seulement si le hash des 2 docs est le même." Si je reprends la ligne :
SI NON comparerHashFichiers(fichier1, fichier2):
Le résultat retourné par la fonction comparerHashFichiers() est un booléen qui sera VRAI si les fichiers sont identiques et FAUX sinon.
SI NON (et non pas SINON) se lit ainsi :
A = vrai, NON A = FAUX, et inversement.
En programmation, la condition SI se lit comme suit :
SI CONDITION:
Exécuter si CONDITION est VRAI
C’est moi qui ai estimé inutile d’aller plus loin si les fichiers sont identiques car leurs mises en pages le seront forcément.
Donc, on n’entre dans la deuxième partie seulement si les deux fichiers sont différents.

"comment pyhton (ou les autres programmes) me montrent les différences entre les 2 documents?"
C’est toi qui décide de la façon d’afficher. Je te conseille de commencer en ligne de commande avec la fonction interne à Python 3 print(). Après tu pourras utiliser le module tkinter pour avoir ce qu’on appelle une interface graphique, un logiciel visuel pour simplifier.

"ça soit indiqué directement dans le document, par un surlignage par exemple."

Pour ce faire, tu peux utiliser visual basic qui est intégré à Office Word. Je ne connais pas bien ce langage de programmation mais en tapant sur un moteur de recherche : "visual basic + ce que tu veux faire" tu devrais trouver.

Enfin, le code que j’ai écrit est en pseudo-code. Il n’y a pas de convention, tu le retranscris avec le langage de programmation de ton choix.

Pour Python, je te suggère de lire ces liens :
https://pythonfaqfr.readthedocs.io/en/latest/
http://sametmax.com/lancer-correctement-python-et-ses-commandes-cousines/
Et le plus important :
https://docs.python.org/fr/3/tutorial/index.html
Messages postés
14858
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 octobre 2020
591
Bonjour

avant de te lancer dans ton projet, il est bon d'apprendre quelques bases.
D'abord un peu d'algorithmique puis les bases d'un langage, langage que tu auras choisis pour ensuite attaquer ton projet.

Le souci est que je n'ai pratiquement jamais codé
ce qui signifie que tu as déjà à minima bidouillé un code.
Dans quel langage?
Messages postés
4
Date d'inscription
dimanche 4 octobre 2020
Statut
Membre
Dernière intervention
5 octobre 2020

Un peu de C pendant mes études (de mémoire c'était des boucles, pointeurs, tableaux... des petits jeux aussi), mais ça remonte à loin et là je devrai tout reprendre à zéro je pense.

"D'abord un peu d'algorithmique puis les bases d'un langage"
Tu me conseillerais de prendre des cours? Ou c'est possible à ton avis de m'en sortir avec de l'aide en ligne?

Merci pour ta réponse, bon dimanche
Messages postés
4
Date d'inscription
dimanche 4 octobre 2020
Statut
Membre
Dernière intervention
5 octobre 2020

Je ne savais pas par où commencer, tes liens vont m'être très utiles.

Ensuite comparer deux pdfs ou word peut se faire avec n’importe quel langage et n’est pas trop compliqué.
ça me rassure. Je vais donc me lancer!

Merci encore.
Messages postés
14858
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 octobre 2020
591
Cela dit ça dépend à quel point tu veux comparer...
  • Juste le texte => plutôt facile
  • La mise en page => moins facile
Messages postés
4
Date d'inscription
dimanche 4 octobre 2020
Statut
Membre
Dernière intervention
5 octobre 2020

Le texte ça c'est sûr, et si j'arrive à comparer également la mise en page ça serait parfait. Et là pour l'instant, c'est fait manuellement.
Messages postés
4
Date d'inscription
dimanche 4 octobre 2020
Statut
Membre
Dernière intervention
5 octobre 2020

Merci pour votre réponse. Je suis vraiment ravie d'avoir des réponses au sujet de ma problématique!
Je viens de télécharger python et là j'apprends à m'en servir pour le moment.
Donc, pour l'instant, j'ai un peu de mal à comprendre votre programme, mais si je comprends bien, je compare d'abord le contenu des documents et ensuite je compare la mise en page. Et je peux faire appel à la 2e étape si et seulement si le hash des 2 docs est le même. Est-ce bien ça?

J'ai une autre question : une fois que j'ai fait mon ptit programme, comment pyhton (ou les autres programmes) me montrent les différences entre les 2 documents? Il me les affiche directement sur le document ou dans un tableau ou autre? Car idéalement, j'aimerai bien que ça soit indiqué directement dans le document, par un surlignage par exemple. A votre avis, c'est possible/faisable?

Bonne journée tout le monde
Merci pour vos réponses! ça me permet de voir dans quoi je me lance!

En réponse à [Dal] :

"En résumé, ce sur quoi tu te lances n'est pas vraiment un projet à la portée d'un niveau débutant.

Cela reste un projet intéressant, mais peut-être devrais tu commencer par des projets plus modestes, pour ne pas te décourager. "


Alors en effet d'après tes explications et celles que j'ai reçues, je me rends compte petit à petit que c'est probablement compliqué pour mon niveau... Ce qui m'intéresse, au final, c' est de montrer visuellement sur le document les différences et je ne réalisais pas que je devais faire appel à des bibliothèques ou m'intéresser au formalisme de pdf ou word.

"En ce qui concerne la comparaison de "mise en page", je doute que l'on puisse faire quelque chose facilement, et à vrai dire, je ne suis pas sûr de comprendre de quoi on parle exactement et le type de changements qui seraient à détecter."

Il s'agirait d'un saut de ligne en trop ou d'un style différent sur un titre par exemple. Mais je peux à la rigueur me passer de cette partie, c'était vraiment pour n'avoir rien à comparer manuellement, je me suis probablement enflammée.

En réponse à Dachiasse :

"Pour ce faire, tu peux utiliser visual basic qui est intégré à Office Word. Je ne connais pas bien ce langage de programmation mais en tapant sur un moteur de recherche : "visual basic + ce que tu veux faire" tu devrais trouver. "

Je n'y avais pas du tout pensé, merci! je peux explorer cette piste et voir si c'est possible.

Et je comprends tout à fait que ce n'était pas du python mais un algo, il me reste plus qu'à savoir comment codé tout ça dans le bon langage.

Vu le chantier que c'est et puisque je ne programme pas du tout, je vais réfléchir et voir si je me lance. Je n'ai pas d'autres tâches pour l'instant à automatiser et je trouvais plus motivant d'avoir un exemple concret sur lequel travailler.

Merci encore pour vos précieux conseils.
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
Tu peux commencer par quelque chose de simple qui compare des documents exactement identiques et qui sont dans le même répertoire sous des noms différents ou dans des répertoires différents.

Si tu fais le choix du langage Python, qui est choix très courant pour les débutants de nos jours, tu peux par exemple comparer des fichiers avec le module filecmp :
https://docs.python.org/3/library/filecmp.html

Si tu veux calculer des hash, tu as :
https://docs.python.org/3/library/hashlib.html
(mais filecmp est plus facile d'utilisation)

Ces modules sont dans la bibliothèque standard de Python, tu n'auras rien à installer en plus.

Quand tu sera plus à l'aise, tu pourras ajouter une comparaison d'une extraction du texte brut.

etc.