9
votes

Comment obtenir le diff de deux fichiers PDF à l'aide de Python?

J'ai besoin de trouver la différence entre deux fichiers PDF. Est-ce que quelqu'un connaît-il de tout outil lié à Python qui a une fonctionnalité qui donne directement Diff des deux PDFS?


1 commentaires

Differez-vous le texte ou le contenu entier ou la taille?


5 Réponses :


11
votes

Que voulez-vous dire par "différence"? Une différence dans le texte du PDF ou un changement de présentation (par exemple un graphique intégré a été redimensionné). Le premier est facile à détecter, la seconde est presque impossible à obtenir (PDF est un format de fichier très compliqué, offrant des capacités de formatage des fichiers sans fin).

Si vous souhaitez obtenir le texte diff, il vous suffit d'exécuter un fichier PDF à un utilitaire de texte sur les deux PDF, puis utilisez la bibliothèque DIFF intégrée de Python pour faire la différence des textes convertis.

Cette question concerne le PDF à la conversion de texte à Python: module Python pour la conversion PDF au texte .

La fiabilité de cette méthode dépend des générateurs PDF que vous utilisez. Si vous utilisez E.G. Adobe Acrobat et certains PDF-Créateur basé sur Ghostscript pour effectuer deux PDF à partir du même document Word, vous pourriez toujours obtenir un DIFF bien que le document source soit identique.

En effet, il existe des dizaines de façons d'encoder les informations du document source à un fichier PDF et chaque convertisseur utilise une approche différente. Souvent, le convertisseur PDF au texte ne peut pas comprendre le flux de texte correct, en particulier avec des dispositions ou des tables complexes.


2 commentaires

Juste le texte va faire. Le générateur PDF ne devrait pas être un problème.


Si vous devez prendre en charge les images, vous pouvez extraire des JPGS à partir d'un PDF: Nedbatchelder.com/blog/ 200712 / extraction_jpgs_from_pdfs.html ou convertissez le PDF en une image et comparez cela.



0
votes

Vérifiez cela, il peut être utile: http://pybrary.net/pypypdf/ < / p>


1 commentaires

PYPDF n'était pas très robuste dans mes tests. Il s'est écrasé sur des fichiers PDF créés par Illustrator / InDesign et d'autres programmes de dessin vectoriel. Cependant, cela pourrait être correct pour les PDF simples des applications Office. Une alternative beaucoup plus solide est pdftotext de la boîte à outils XPDF.



5
votes

Je ne connais pas votre cas d'utilisation, mais pour les tests de régression du script qui génère un PDF à l'aide de rappel, je fais des fichiers PDF par

  1. Conversion de chaque page en une image utilisant GhostsIPT
  2. Diffinging chaque page contre la page Image de la page PDF standard, à l'aide de PIL

    E.g xxx

    Ceci fonctionne dans mon cas pour signaler toute modification introduite en raison de changements de code.


1 commentaires

Y a-t-il une référence pour votre étape 1?



3
votes

a rencontré la même question sur mon PDF crypté Unittest, ni pdfminer ni pypdf ne fonctionne bien pour moi.

Voici deux commandes (PDFTOCAIRO, PDFTOTEXT) fonctionner parfaitement sur mon test. (Ubuntu Installer: APT-GET INSTALL POPPLER-UTILS) P>

Vous pouvez obtenir le contenu PDF par: P>

c1 = get_formatted_content(open('f1.pdf').read())
c2 = get_formatted_content(open('f2.pdf').read())
print(cmp(c1, c2)) # for binary compare
# import difflib
# print(list(difflib.unified_diff(c1, c2))) # for text compare


0 commentaires

3
votes

Même si cette question est assez ancienne, je suppose que je peux contribuer au sujet.

Nous avons plusieurs applications générant des tonnes de PDFS. Une de ces applications est écrite dans Python et je voulais récemment écrire des tests d'intégration pour vérifier si la génération PDF fonctionnait correctement.

Test génération PDF est dur , car les spécifications pour Les fichiers PDF sont très compliqués et non déterministes. Deux pdfs, générés avec les mêmes données d'entrée exacts, généreront différents fichiers. La comparaison de fichiers directe est donc supprimée.

La solution: nous devons aller avec le test de la façon dont ils ressemblent (parce que que devrait être déterministe!) Il suffit de besoin d'un nom de fichier ou de la blob PDF (octets) du générateur. Nous avons également besoin d'un fichier d'attente contenant un «bon» pdf de comparer avec celui provenant du générateur.

Les PDF sont convertis en images, puis comparées. Cela peut être fait de plusieurs manières, mais nous avons décidé d'utiliser imagemagick , car il est extrêmement polyvalent et très mature, avec des liaisons pour presque tous les langages de programmation. Pour Python 3, les reliures sont proposées par le package WAND .

Le test ressemble à quelque chose comme ce qui suit. Les détails spécifiques de notre mise en œuvre ont été supprimés et l'exemple a été simplifié: xxx

0.01 est aussi bas que possible de tolérer de petites différences. Considérant que diff [1] varie de 0 à 1 à l'aide de la métrique root_mean_square , nous acceptons ici une différence jusqu'à 1% sur tous les canaux, comparant avec le fichier attendu de l'échantillon. .


0 commentaires