Certaines revues génèrent un PDF différent pour chaque téléchargement. APS, par exemple, stocke l'heure et l'adresse IP dans le PDF.
Ou il existe une version papier avec des hyperliens et une avec des références textuelles.
Comment est-il possible de trouver des téléchargements en double d'articles avec un contenu égal à 90% sur un système Linux en utilisant un logiciel open source?
J'ai pensé à convertir les fichiers PDF en texte brut dans un répertoire temporaire avec pdf2txt
. Ensuite, je pourrais filtrer tous les noms de fichiers qui diff a b
produisent plus de x lignes. Mais ce n'est pas élégant du tout et échouera avec les publications numérisées. Les revues ne fournissent souvent pas de texte OCR pour les anciennes publications.
J'ai également essayé compare
dans la suite ImageMagick, mais je ne pouvais pas gérer les fichiers PDF multipages avec cet outil.
diffpdf 2.1.1 fait un bon travail dans une interface graphique sur deux fichiers, mais je n'ai pas pu comprendre comment l'appliquer sur de nombreux fichiers, et les versions récentes ne sont disponibles sous aucune licence open source.
la source
blah.pdf[1]
appellera la page souhaitée du document.Réponses:
Étant donné que différents éditeurs utilisent différentes méthodes de «marquage» des fichiers PDF, vous devez vous assurer de les comparer sans prendre en compte les marquages.
Vous avez également besoin d'une méthode efficace pour comparer un nouveau PDF à tous les PDF déjà téléchargés au cas où vous téléchargez à plusieurs reprises le même PDF et qu'il est par exemple marqué de l'IP et / ou de l'horodatage comme vous le suggérez. Vous ne voulez pas utiliser un mécanisme de comparaison chronophage qui compare chaque nouveau PDF avec de nombreux PDF déjà téléchargés
Vous avez besoin d'un utilitaire qui supprime chacun des marquages possibles et génère un hachage des données restantes. Vous devrez conserver une table de hachage → nom de fichier, qui peut être dans un fichier simple, et si un hachage calculé est déjà dans le fichier, vous en avez un doublon (et supprimez-le ou faites tout ce qui est nécessaire) et si le hachage n'est pas encore là, vous ajoutez le hachage et le nom du fichier. Le fichier ressemblerait à quelque chose comme:
Ce fichier est négligemment petit par rapport aux PDF d'origine. Si vous avez des millions de PDF, vous pouvez envisager de stocker ces données dans une base de données. Pour des raisons d'efficacité, vous souhaiterez peut-être inclure la taille du fichier et le nombre de pages (
pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).Ce qui précède pousse le problème à supprimer les marquages et à générer le hachage. Si vous savez d'où vient le PDF lors de l'appel de la routine de génération de hachage (c'est-à-dire si vous effectuez les téléchargements par programme), vous pouvez affiner la génération de hachage en fonction de cela. Mais même sans cela, il existe plusieurs possibilités pour la génération de hachage:
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
pour obtenir le hachage. Vous pouvez également inclure le nombre de pages dans le calcul du hachage ('Pages:
' dans lapdfinfo
sortie).imagemagick
). Vous pouvez utiliserpdfimages
pour extraire les informations d'image dans un fichier temporaire.pdftext
pour extraire le texte, filtrer le marquage (si vous filtrez un peu trop, ce n'est pas un problème), puis générer le hachage en fonction de cette.De plus, vous pouvez comparer si la taille du fichier de l'ancien fichier trouvé via le hachage et voir si se trouve dans certaines marges avec le nouveau fichier. La compression et les différences dans les chaînes (IP / horodatage) ne devraient entraîner qu'une différence de moins d'un pour cent.
Si vous connaissez la méthode que l'éditeur utilise pour déterminer le hachage, vous pouvez directement appliquer la "bonne" méthode de ce qui précède, mais même sans cela, vous pouvez vérifier les métadonnées et appliquer des heuristiques, ou déterminer le nombre d'images dans un fichier et comparez cela avec le nombre de pages (si elles sont proches, vous avez probablement un document composé de numérisations).
pdftext
sur les images numérisées, les PDF ont également une sortie reconnaissable.Comme base de travail, j'ai créé un package python qui est sur bitbucket et / ou peut être installé à partir de PyPI en utilisant
pip install ruamel.pdfdouble
. Cela vous fournit lapdfdbl
commande qui effectue la numérisation comme décrit ci-dessus sur les métadonnées, les images extraites ou le texte. Il ne filtre pas (encore) les marquages , mais le fichier Lisez-moi décrit les (deux) méthodes à améliorer pour l'ajouter.Le fichier Lisezmoi inclus:
ruamel.pdfdouble
ce package fournit la
pdfdbl
commande:Cela parcourra les répertoires fournis en argument et pour les fichiers PDF trouvés, créez un hachage basé sur (dans l'ordre):
Cela suppose que pdfinfo, pdfimages et pdftotext` du paquet poppler-utils sont disponibles.
Une "base de données" est en train de se constituer, par
~/.config/pdfdbl/pdf.lst
rapport à laquelle d'autres analyses sont testées.Suppression des marquages
Il
ruamel/pdfdouble/pdfdouble.py
existe deux méthodes qui peuvent être améliorées pour filtrer les marquages dans le PDF qui les rendent moins uniques et font pratiquement les mêmes fichiers pour avoir des hachages différents.Pour le texte, la méthode
PdfData.filter_for_marking
doit être étendue pour supprimer et marquer de la chaîne qui est ses arguments et retourner le résultat.Pour les images numérisées, la méthode
PdfData.process_image_and_update
doit être améliorée, par exemple en coupant les lignes X inférieures et supérieures des images, et en supprimant tout texte d'arrière-plan gris en définissant tous les pixels noirs sur blanc. Cette fonction doit mettre à jour le hachage transmis à l'aide de la.update()
méthode transmettant les données filtrées.Restrictions
La "base de données" actuelle ne peut pas gérer les chemins d'accès qui contiennent des retours à la ligne
Cet utilitaire est actuellement Python 2.7 uniquement.
Les parties de chaîne conformes à IP peuvent être remplacées par le
re
module de Python :la source
pdfrw
pour extraire les métadonnées, mais cela ne peut pas gérer les fichiers PDF chiffrés, où c'estpdfinfo
possible.Je donnerais
pdftotext
une autre chance, au moins pour les fichiers PDF de votre collection qui contiennent réellement du texte (sinon vous auriez besoin d'exécuter l'OCR), en utilisant un meilleur outil pour traiter la sortie.Une fois que vous avez votre sortie de texte (sale), exécutez-la via un programme conçu pour déterminer les similitudes (plutôt que
diff
les différences ligne par ligne, ce qui serait un chemin rapide vers la folie).Considérez quelque chose comme String :: Similarity de perl ou le programme simhash (qui est disponible dans Debian mais pas Fedora / RHEL).
la source
Les PDF contiennent des métadonnées et je viens de vérifier un certain nombre d'articles liés à la physique de différents éditeurs et ils ont tous au moins l'attribut "Titre". Pour certains, le titre est le titre réel de la publication, pour certains, il contient le DOI ou des identifiants similaires. Quoi qu'il en soit, chaque article que j'ai vérifié contient le titre, et c'est toujours quelque chose d'unique à la publication donnée.
Vous pouvez utiliser
pdftk
pour accéder aux métadonnées des PDF et les comparer. Pour votre objectif, cela devrait certainement être suffisant et beaucoup plus rapide quepdftotext
si les performances sont un problème. Dans le cas où un document ne devrait vraiment pas avoir de métadonnées de titre, vous pourriez toujours y revenirpdftotext
.Pour vider toutes les métadonnées dans un fichier texte (ou stdout) pour un traitement ultérieur, utilisez
ou reportez-vous au manuel pour plus d'options.
Si vous voulez essayer ImageMagick de
compare
mais plusieurs pages posent un problème, vous pouvez également utiliserpdftk
pour extraire des pages uniques et comparer tous séparément (peut - être juste un seul comparait suffit, cependant).Voici un extrait de code qui utilise cette approche pour créer une
diff
sortie PDF semblable à celle des fichiers PDF multipages: https://gist.github.com/mpg/3894692la source
Avez-vous examiné le contenu PDF Comparer ? Il existe des options de ligne de commande qui devraient vous permettre d'automatiser le processus.
Vous pouvez exécuter une sorte de logique sur le journal des différences qu'il crée pour voir à quel point ils sont similaires.
À défaut, vous pourriez essayer de diviser temporairement les PDF en plusieurs fichiers et de les comparer de cette façon. Vous auriez probablement encore des doublons de cette façon. Un PDF peut simplement avoir une page vierge supplémentaire ou quelque chose qui ferait comparer toutes les pages suivantes comme étant complètement différentes.
la source
Suite à une humble contribution à la discussion (réponse partielle):
Après la conversion en texte, j'utiliserais ce qui suit pour calculer la smilarité du fichier (basé sur la différence de mots):
(1) produit un résultat comme
(2) = 93
la source
J'ai un script qui regarde un pdf et essaie d'abord d'extraire du texte en utilisant
pdftotext
, mais si cela échoue (comme ce sera le cas avec un document numérisé), il utilise ghostscript pour transformer un pdf numérisé de plusieurs pages en une série de fichiers png, puis utilise tesseract pour convertir cette série en un seul fichier texte. Si la numérisation est de qualité suffisante, elle fait un très bon travail. Il serait simple d'ajouter du code comparant le texte entre les fichiers mais je n'ai pas eu cette exigence.ghostscript et tesseract sont tous deux open source et fonctionnent à partir de la ligne de commande.
la source
pdfimages
du package poppler sans perte supplémentaire de qualité que vous pourriez obtenir avec le rendu via ghostscript (ce qui influence négativement tout OCR que vous voulez faire).pdfimages
la même chose que ghostscript (gs
) ici, c'est-à-dire extraire des images de pdf en jpg / png. Pourquoi est-ce mieux que çags
?gs
/tesseract
(format intermédiaire png) fonctionne légèrement mieux quepdfimages
/tesseract
(format intermédiaire pbm).pdfimages
est plus rapide cependant.Je proposerais Perl comme solution. Il y a un module appelé
CAM::PDF
qui vous permet d'extraire ... du contenu PDF.Cela fonctionne un peu comme ceci:
Vous pouvez extraire le texte et le comparer.
Pour les documents numérisés uniquement - c'est beaucoup plus difficile, mais en supposant qu'ils utilisent les mêmes images de base (par exemple, ils ne les ont pas numérisés séparément), vous pouvez probablement utiliser:
Je ne l'ai pas particulièrement bien testé, car je n'ai pas vos documents sources. Je pense que cette approche devrait faire l'affaire - vous ne comparez pas le contenu réel de l'image, car ... eh bien, c'est vraiment difficile. Mais vous devriez pouvoir reconnaître des images similaires à partir des métadonnées.
Pour des PDF identiques avec des métadonnées différentes, alors quelque chose de simple comme hacher le contenu du texte et les métadonnées de l'image devrait faire l'affaire.
la source
Il existe une application Linux, appelée recoll . Il peut effectuer la tâche, mais uniquement pour les fichiers PDF avec couche de texte.
la source
recoll
semble que c'est un moteur de recherche de bureau. Je ne pouvais pas voir comment l'utiliser pour trouver des doublons.recoll
utilisepdftotext
pour gérer les fichiers PDF, ce que l'OP essaie d'éviter ici.