Einige Zeitschriften generieren für jeden Download ein anderes PDF. APS speichert beispielsweise die Zeit und die IP-Adresse im PDF.
Oder es gibt eine Papierversion mit Hyperlinks und eine mit Textreferenzen.
Wie ist es möglich, doppelte Downloads von Papieren mit 90% gleichem Inhalt auf einem Linux-System mithilfe von Open-Source-Software zu finden?
Ich habe darüber nachgedacht, die PDF-Dateien in einfachen Text in einem temporären Verzeichnis mit zu konvertieren pdf2txt
. Dann könnte ich alle Dateinamen filtern, was diff a b
mehr als x Zeilen ergibt. Dies ist jedoch überhaupt nicht elegant und schlägt bei gescannten Veröffentlichungen fehl. Zeitschriften bieten häufig keinen OCR-Text für alte Veröffentlichungen.
Ich habe es auch compare
in der ImageMagick-Suite versucht, konnte jedoch mit diesem Tool keine mehrseitigen PDF-Dateien verarbeiten.
diffpdf 2.1.1 leistet gute Arbeit in einer GUI für zwei Dateien, aber ich konnte nicht herausfinden, wie es auf viele Dateien angewendet werden kann, und neuere Versionen sind unter keiner Open Source-Lizenz verfügbar.
quelle
blah.pdf[1]
ruft eine gewünschte Seite aus dem Dokument auf.Antworten:
Da verschiedene Verlage unterschiedliche Methoden zum "Markieren" der PDFs verwenden, müssen Sie sicherstellen, dass Sie sie vergleichen, ohne die Markierungen zu berücksichtigen.
Sie benötigen auch eine effiziente Methode, um ein neues PDF mit allen bereits heruntergeladenen PDFs zu vergleichen, falls Sie wiederholt dasselbe PDF herunterladen und es z. B. mit der IP und / oder dem Datums- / Zeitstempel gekennzeichnet ist, wie Sie vorschlagen. Sie möchten keinen zeitaufwändigen Vergleichsmechanismus verwenden, der jedes neue PDF mit vielen bereits heruntergeladenen PDFs vergleicht
Was Sie brauchen, ist ein Dienstprogramm, das jede der möglichen Markierungen entfernt und einen Hash der verbleibenden Daten generiert. Sie müssen eine Hash → Dateinamenzuordnung behalten, die sich in einer einfachen Datei befinden kann. Wenn sich bereits ein berechneter Hash in der Datei befindet, haben Sie ein Duplikat (und löschen es oder tun, was auch immer erforderlich ist) und wenn der Hash noch nicht vorhanden ist Dort fügen Sie den Hash und den Dateinamen hinzu. Die Datei würde ungefähr so aussehen:
Diese Datei ist im Vergleich zu den Original-PDFs fahrlässig klein. Wenn Sie Millionen von PDFs haben, können Sie diese Daten in einer Datenbank speichern. Aus Effizienzgründen möchten Sie möglicherweise die Dateigröße und die Anzahl der Seiten dort einfügen (
pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).Das Obige führt dazu, dass die Markierungen entfernt und der Hash generiert werden. Wenn Sie wissen, woher das PDF stammt, wenn Sie die Hash-Generierungsroutine aufrufen (dh wenn Sie die Downloads programmgesteuert durchführen), können Sie die Hash-Generierung basierend darauf optimieren. Aber auch ohne das gibt es mehrere Möglichkeiten für die Hash-Generierung:
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
, um den Hash zu erhalten. Sie können auch die Anzahl der Seiten in die Berechnung des Hashs einbeziehen ('Pages:
' in derpdfinfo
Ausgabe).imagemagick
). Sie könnenpdfimages
die Bildinformationen in eine temporäre Datei extrahieren.pdftext
den Text extrahieren, die Markierung herausfiltern (wenn Sie ein wenig zu viel herausfiltern, ist dies kein Problem) und dann den Hash basierend auf generieren Das.Außerdem können Sie vergleichen, ob die Dateigröße der alten Datei, die über den Hash gefunden wurde, mit der neuen Datei innerhalb bestimmter Grenzen liegt. Komprimierung und ifferences in Zeichenfolgen (IP / Datums- / Zeitstempel) sollten nur zu einem Unterschied von weniger als einem Prozent führen.
Wenn Sie die Methode kennen, die der Herausgeber bei der Ermittlung des Hashs verwendet, können Sie die oben beschriebene "richtige" Methode direkt anwenden. Auch ohne diese Methode können Sie nach Metadaten suchen und einige Heuristiken anwenden oder die Anzahl der Bilder in einer Datei bestimmen und vergleichen Sie das mit der Anzahl der Seiten (wenn sie geschlossen sind, haben Sie wahrscheinlich ein Dokument, das aus Scans besteht).
pdftext
Bei gescannten Bildern haben PDFs auch eine erkennbare Ausgabe.Als Grundlage für die Arbeit habe ich ein Python-Paket erstellt, das sich auf Bitbucket befindet und / oder mit PyPI installiert werden kann
pip install ruamel.pdfdouble
. Auf diese Weise erhalten Sie denpdfdbl
Befehl, der das Scannen wie oben beschrieben für Metadaten, extrahierte Bilder oder Text ausführt. Es führt keine Filterung von Markierungen (noch) nicht , aber die readme beschrieben , die (zwei) Methoden zu verbessern , das zu tun hinzuzufügen.Die mitgelieferte Readme:
ruamel.pdfdouble
Dieses Paket enthält den folgenden
pdfdbl
Befehl:Dadurch werden die als Argument angegebenen Verzeichnisse durchsucht und für die gefundenen PDF-Dateien ein Hash erstellt, der auf (in der Reihenfolge) basiert:
Dies setzt voraus, dass pdfinfo, pdfimages und pdftotext` aus dem poppler-utils-Paket verfügbar sind.
Es wird eine "Datenbank" aufgebaut, in
~/.config/pdfdbl/pdf.lst
der weitere Scans getestet werden.Markierungen entfernen
Es
ruamel/pdfdouble/pdfdouble.py
gibt zwei Methoden, die verbessert werden können, um Markierungen in der PDF-Datei herauszufiltern, die sie weniger eindeutig machen und praktisch dieselben Dateien mit unterschiedlichen Hashes erstellen.Für Text sollte die Methode
PdfData.filter_for_marking
erweitert werden, um Markierungen aus der Zeichenfolge, die ihre Argumente sind, zu entfernen und das Ergebnis zurückzugeben.Bei gescannten Bildern muss die Methode
PdfData.process_image_and_update
verbessert werden, z. B. indem die unteren und oberen X-Linien der Bilder abgeschnitten werden und grauer Hintergrundtext entfernt wird, indem alle schwarzen Pixel auf Weiß gesetzt werden. Diese Funktion muss den übergebenen Hash mithilfe der.update()
in den gefilterten Daten übergebenen Methode aktualisieren .Beschränkungen
Die aktuelle "Datenbank" kann keine Pfade verarbeiten, die Zeilenumbrüche enthalten
Dieses Dienstprogramm ist derzeit nur Python 2.7.
IP-konforme Stringparts können durch das Python-
re
Modul ersetzt werden:quelle
pdfrw
zum Extrahieren von Metadaten verwendet, aber das kann keine verschlüsselten PDF-Dateien verarbeiten, wo dies möglichpdfinfo
ist.Ich würde eine
pdftotext
weitere Chance geben, zumindest für die PDFs in Ihrer Sammlung, die tatsächlich Text enthalten (andernfalls müssten Sie OCR ausführen), und ein besseres Tool verwenden, um die Ausgabe zu verarbeiten.Sobald Sie Ihre (schmutzige) Textausgabe haben, führen Sie sie durch ein Programm, mit dem Ähnlichkeiten ermittelt werden sollen (und nicht
diff
die zeilenweisen Unterschiede, die ein schneller Weg zum Wahnsinn wären).Betrachten Sie etwas wie String :: Similarity des Perls oder das Simhash- Programm (das in Debian, aber nicht in Fedora / RHEL verfügbar ist).
quelle
Die PDFs enthalten Metadaten, und ich habe gerade eine Reihe von physikbezogenen Artikeln verschiedener Verlage überprüft, und alle haben mindestens das Attribut "Titel". Für einige ist der Titel der eigentliche Titel der Veröffentlichung, für einige enthält er den DOI oder ähnliche Bezeichner. Wie auch immer, jedes Papier, das ich überprüft habe, enthält den Titel, und es ist immer etwas Einzigartiges für die jeweilige Veröffentlichung.
Sie können
pdftk
damit auf die Metadaten der PDFs zugreifen und diese vergleichen. Für Ihren Zweck sollte dies auf jeden Fall ausreichen und ist viel schneller, alspdftotext
wenn die Leistung ein Problem darstellt. Für den Fall, dass ein Papier wirklich keine Titelmetadaten enthalten sollte, auf die Sie dennoch zurückgreifen könnenpdftotext
.Zum Speichern aller Metadaten in einer Textdatei (oder stdout) zur weiteren Verarbeitung
Weitere Informationen finden Sie im Handbuch.
Wenn Sie ImageMagicks ausprobieren möchten ,
compare
aber mehrere Seiten ein Problem verursachen, können Sie auchpdftk
einzelne Seiten extrahieren und alle separat vergleichen (möglicherweise reicht es jedoch aus, nur eine einzelne Seite zu vergleichen).Hier ist ein Codefragment, das diesen Ansatz verwendet, um eine
diff
ähnliche PDF-Ausgabe für mehrseitige PDFs zu erstellen : https://gist.github.com/mpg/3894692quelle
Haben Sie sich mit PDF Content Comparer befasst ? Es gibt Befehlszeilenoptionen, mit denen Sie den Prozess automatisieren können.
Sie können eine Art Logik für das Differenzprotokoll ausführen, um zu sehen, wie ähnlich sie sind.
Andernfalls können Sie versuchen , die PDFs vorübergehend in mehrere Dateien aufzuteilen und auf diese Weise zu vergleichen. Auf diese Weise hätten Sie wahrscheinlich immer noch Duplikate. Eine PDF-Datei enthält möglicherweise nur eine zusätzliche leere Seite oder etwas, das dazu führt, dass alle nachfolgenden Seiten als völlig unterschiedlich verglichen werden.
quelle
Nach einem bescheidenen Beitrag zur Diskussion (Teilantwort):
Nach der Konvertierung in Text würde ich Folgendes verwenden, um die (wortdifferenzbasierte) Dateiähnlichkeit zu berechnen:
(1) ergibt ein Ergebnis wie
(2) = 93
quelle
Ich habe ein Skript, das sich ein PDF ansieht und zuerst versucht, Text mit zu extrahieren.
pdftotext
Wenn dies jedoch fehlschlägt (wie bei einem gescannten Dokument), verwendet es Ghostscript , um ein mehrseitig gescanntes PDF in eine Reihe von PNG-Dateien umzuwandeln und dann verwendet tesseract , um diese Reihe in eine einzelne Textdatei zu konvertieren. Wenn der Scan von ausreichender Qualität ist, macht er einen ziemlich guten Job. Es wäre unkompliziert, Code hinzuzufügen, der den Text zwischen Dateien vergleicht, aber ich hatte diese Anforderung nicht.Ghostscript und Tesseract sind beide Open Source und funktionieren über die Befehlszeile.
quelle
pdfimages
aus dem Poppler-Paket extrahieren, ohne dass zusätzliche Qualitätsverluste beim Rendern durch Ghostscript auftreten (was sich negativ auf die gewünschte OCR auswirkt).pdfimages
genau das Gleiche wie Ghostscript (gs
), dh Bilder aus PDF nach JPG / PNG extrahieren. Warum ist das besser alsgs
?gs
/tesseract
(png-Zwischenformat) etwas besser funktioniert alspdfimages
/tesseract
(pbm-Zwischenformat).pdfimages
ist aber schneller.Ich würde Perl als Lösung anbieten. Es gibt ein Modul namens
CAM::PDF
, mit dem Sie ... PDF-Inhalte extrahieren können.Es funktioniert ein bisschen so:
Sie können den Text extrahieren und vergleichen.
Nur für gescannte Dokumente - es ist viel schwieriger, aber wenn sie dieselben Basisbilder verwenden (z. B. nicht separat gescannt haben), können Sie wahrscheinlich Folgendes verwenden:
Ich habe es nicht besonders gut getestet, weil ich Ihre Quelldokumente nicht habe. Ich denke, dieser Ansatz sollte den Trick machen - Sie vergleichen nicht den tatsächlichen Bildinhalt, weil ... nun, das ist wirklich schwierig. Sie sollten jedoch in der Lage sein, ähnliche Bilder anhand der Metadaten zu erkennen.
Bei identischen PDFs mit unterschiedlichen Metadaten sollte etwas Einfaches wie das Hashing des Textinhalts und der Bildmetadaten ausreichen.
quelle
Es gibt eine Linux-Anwendung namens recoll . Es kann die Aufgabe ausführen, jedoch nur für PDFs mit Textebene.
quelle
recoll
scheint eine Desktop-Suchmaschine zu sein. Ich konnte nicht sehen, wie man damit Duplikate findet.recoll
verwendetpdftotext
, um PDFs zu verarbeiten, was das OP hier zu vermeiden versucht.