Ich habe Tausende von Dokumenten und einige davon werden gescannt. Ich benötige also ein Skript, um alle PDF-Dateien zu testen, die zu einem Verzeichnis gehören. Gibt es eine einfache Möglichkeit, das zu tun?
- Die meisten PDFs sind Berichte. Sie haben also viel Text.
Sie sind sehr unterschiedlich, aber die gescannten, wie unten erwähnt, können aufgrund eines prekären OCR-Prozesses, der mit dem Scan gekoppelt ist, Text finden.
Der Vorschlag aufgrund von Sudodus in den Kommentaren unten scheint sehr interessant zu sein. Sehen Sie sich den Unterschied zwischen einem gescannten und einem nicht gescannten PDF an:
Gescannt:
grep --color -a 'Image' AR-G1002.pdf
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 340615/Name/Obj13/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40452/Name/Obj18/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41680/Name/Obj23/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41432/Name/Obj28/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59084/Name/Obj33/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 472681/Name/Obj38/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 469340/Name/Obj43/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 371863/Name/Obj48/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 344092/Name/Obj53/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59416/Name/Obj58/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 48308/Name/Obj63/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 51564/Name/Obj68/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 63184/Name/Obj73/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40824/Name/Obj78/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 23320/Name/Obj83/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 31504/Name/Obj93/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 18996/Name/Obj98/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 292932/Name/Obj103/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 27720/Name/Obj108/Subtype/Image/Type/XObject/Width 1698>>stream
<rdf:li xml:lang="x-default">Image</rdf:li>
<rdf:li xml:lang="x-default">Image</rdf:li>
Nicht gescannt:
grep --color -a 'Image' AR-G1003.pdf
<</Lang(en-US)/MarkInfo<</Marked true>>/Metadata 167 0 R/Pages 2 0 R/StructTreeR<</Contents 4 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F4 11 0 R/F5 13 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/<</Filter/FlateDecode/Length 5463>>stream
<</BaseFont/Times#20New#20Roman,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontD<</Ascent 891/AvgWidth 427/CapHeight 677/Descent -216/Flags 32/FontBBox[-558 -216 2000 677]/FontName/Times#20New#20Roman,Bold/FontWeight 700/ItalicAngle 0/Leadi<</BaseFont/Times#20New#20Roman/Encoding/WinAnsiEncoding/FirstChar 32/FontDescri<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontName/Times#20New#20Roman/FontWeight 400/ItalicAngle 0/Leading 42<</BaseFont/Arial,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 10 0<</Ascent 905/AvgWidth 479/CapHeight 728/Descent -210/Flags 32/FontBBox[-628 -210 2000 728]/FontName/Arial,Bold/FontWeight 700/ItalicAngle 0/Leading 33/MaxWidth<</BaseFont/Times#20New#20Roman,Italic/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 12 0 R/LastChar 118/Name/F4/Subtype/TrueType/Type/Font/Widths 164 0 <</Ascent 891/AvgWidth 402/CapHeight 694/Descent -216/Flags 32/FontBBox[-498 -216 1333 694]/FontName/Times#20New#20Roman,Italic/FontWeight 400/ItalicAngle -16.4<</BaseFont/Arial/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 14 0 R/La<</Ascent 905/AvgWidth 441/CapHeight 728/Descent -210/Flags 32/FontBBox[-665 -210 2000 728]/FontName/Arial/FontWeight 400/ItalicAngle 0/Leading 33/MaxWidth 2665<</Contents 16 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 7534>>streamarents 1/Tabs/S/Type/Page>>
<</Contents 18 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 6137>>streamarents 2/Tabs/S/Type/Page>>
<</Contents 20 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R/F6 21 0 R><</Filter/FlateDecode/Length 6533>>stream>>/StructParents 3/Tabs/S/Type/Page>>
<</BaseFont/Times#20New#20Roman/DescendantFonts 22 0 R/Encoding/Identity-H/Subty<</BaseFont/Times#20New#20Roman/CIDSystemInfo 24 0 R/CIDToGIDMap/Identity/DW 100<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontFile2 160 0 R/FontName/Times#20New#20Roman/FontWeight 400/Italic<</Contents 27 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</ExtGState<</GS28 28 0 R/GS29 29 0 R>>/Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F5 13 0 R/F6 21 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC<</Filter/FlateDecode/Length 5369>>streamge>>
Die Anzahl der Bilder pro Seite ist viel größer (ungefähr eines pro Seite)!
command-line
pdf
DanielTheRocketMan
quelle
quelle
pdf
Datei ein Bild enthält (in ein Dokument neben Text oder als ganze Seiten eingefügt, 'gescanntes PDF'), enthält die Datei häufig (möglicherweise immer) die Zeichenfolge/Image/
, die über die Befehlszeile gefunden werden kanngrep --color -a 'Image' filename.pdf
. Dadurch werden Dateien, die nur Text enthalten, von Dateien getrennt, die Bilder enthalten (ganzseitige Bilder sowie Textseiten mit kleinen Logos und mittelgroßen Illustrationsbildern).Antworten:
Shell-Skript
Wenn eine
pdf
Datei ein Bild enthält (in ein Dokument neben Text oder als ganze Seiten eingefügt, 'gescanntes PDF'), enthält die Datei häufig (möglicherweise immer) die Zeichenfolge/Image/
.Auf die gleiche Weise können Sie nach der Zeichenfolge suchen, um festzustellen
/Text
, ob eine PDF-Datei Text enthält (nicht gescannt).Ich habe das Shellscript erstellt
pdf-text-or-image
und es funktioniert in den meisten Fällen mit Ihren Dateien. Das Shellscript sucht nach den Textzeichenfolgen/Image/
und/Text
in denpdf
Dateien.Machen Sie das Shellscript ausführbar,
Wechseln Sie in das Verzeichnis, in dem Sie die
pdf
Dateien haben, und führen Sie das Shellscript aus.Identifizierte Dateien werden in die folgenden Unterverzeichnisse verschoben
scanned
text
s-and-t
(für Dokumente mit [gescannten?] Bildern und Textinhalten)Nicht identifizierte Dateiobjekte, 'UFOs', verbleiben im aktuellen Verzeichnis.
Prüfung
Getestet habe ich den Shell mit zwei Ihren Dateien,
AR-G1002.pdf
undAR-G1003.pdf
, und mit einigen eigenenpdf
Dateien (die ich unter Verwendung des Libre Office - Impress erstellt).Hoffen wir das
quelle
grep -q
grep -q
sofort mit dem Status Null beendet wird, wenn eine Übereinstimmung gefunden wird (anstatt die gesamten Dateien zu durchsuchen).cd <path to dir>
Alle im PDF-Format gescannten Dateien verbleiben im Ordner, und andere Dateien werden in einen anderen Ordner verschoben.
quelle
file pdf-filename.pdf
erzeugt eine Versionsnummer. Ich konnte nicht nach einem bestimmten Text in BR-L1411-3.pdf suchen. BR-L1411-3.pdf: PDF-Dokument, Version 1.3, konnte jedoch in beiden anderen von Ihnen bereitgestellten Dateien, Version 1.5 und Version, nach Text suchen 1.6 und erhalten Sie eine oder mehrere Übereinstimmungen. Ich habe PDF XChange Viewer verwendet, um diese Dateien zu durchsuchen, hatte aber ähnliche Ergebnisse mit evince. Das Dokument der Version 1.3 stimmte mit nichts überein.file
Ihr Projekt abzuschließen. Obwohl ich, wie es scheint, anderen immer noch unklar ist, was genau Sie erreichen wollen.Ich habe ein Skript erstellt, um festzustellen, ob eine PDF-Datei OCRd war. Die Hauptidee: In OCRd PDFs ist der Text unsichtbar.
Algorithmus zum Testen, ob ein bestimmtes PDF (
f1
) OCRd war:f1
notiert alsf2
f2
f1
undf2
f1
war OCRd, wenn alle Bilder vonf1
undf2
identisch sind.https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh
quelle
Hobbyist bietet eine gute Lösung, wenn den gescannten Dokumenten der Dokumentensammlung kein Text mit optischer Zeichenerkennung (OCR) hinzugefügt wurde. Wenn dies möglich ist, möchten Sie möglicherweise ein Skript
pdfinfo -meta
erstellen , das die Ausgabe von liest und nach dem Tool sucht, mit dem die Datei erstellt wurde, oder eine Python-Routine verwenden, die eine der Python-Bibliotheken verwendet, um sie zu untersuchen. Die Suche nach Text mit einem Tool wiestrings
ist unzuverlässig, da PDF-Inhalte komprimiert werden können. Das Überprüfen des Erstellungswerkzeugs ist auch nicht ausfallsicher, da PDF-Seiten kombiniert werden können. Ich kombiniere routinemäßig PDF-Textdokumente mit gescannten Bildern, um die Dinge zusammenzuhalten.Es tut mir leid, dass ich keine konkreten Vorschläge machen kann. Es ist schon eine Weile her, dass ich mich mit der internen PDF-Struktur befasst habe, aber je nachdem, wie streng Ihre Anforderungen sind, möchten Sie vielleicht wissen, dass dies etwas kompliziert ist. Viel Glück!
quelle
Wenn es mehr darum geht, tatsächlich zu erkennen, ob PDF durch Scannen erstellt wurde, als dass PDF Bilder anstelle von Text enthält, müssen Sie möglicherweise die Metadaten der Datei und nicht nur den Inhalt untersuchen.
Im Allgemeinen gilt für die Dateien, die ich auf meinem Computer und Ihren Testdateien finden konnte, Folgendes:
Ich verwende momentan Windows und habe daher
node.js
das folgende Beispiel verwendet:Um es auszuführen, muss Node.js installiert sein (sollte ein einzelner Befehl sein) und Sie müssen außerdem Folgendes aufrufen:
Verwendungszweck:
Dieses Beispiel wird nicht als fertige Lösung betrachtet, aber mit dem
debug
Flag erhalten Sie einen Einblick in die Metainformationen einer Datei:Die naive Funktion, die ich geschrieben habe, hat 100% Erfolg mit den Dokumenten, die ich auf meinem Computer finden konnte (einschließlich Ihrer Beispiele). Ich habe die Dateien vor dem Ausführen des Programms nach ihrem Status benannt, um festzustellen, ob die Ergebnisse korrekt sind.
Sie können den Debug-Modus zusammen mit ein wenig Programmierung verwenden, um Ihre Ergebnisse erheblich zu verbessern. Sie können die Ausgabe des Programms an andere Programme übergeben. Es wird immer ein vollständiger Pfad pro Zeile vorhanden sein.
quelle
2 Möglichkeiten, die ich mir vorstellen kann:
Verwenden des Textwerkzeugs zum Auswählen: Wenn Sie eine gescannte PDF-Datei verwenden, können die Texte nicht ausgewählt werden. Stattdessen wird ein Feld angezeigt. Sie können diese Tatsache verwenden, um das Skript zu erstellen. Ich weiß, dass es in C ++ QT einen Weg gibt, der unter Linux allerdings nicht sicher ist.
Suche nach Wörtern in einer Datei: In einer nicht gescannten PDF-Datei funktioniert Ihre Suche, jedoch nicht in einer gescannten Datei. Sie müssen nur einige Wörter finden, die allen PDFs gemeinsam sind, oder ich würde eher sagen, dass Sie in allen PDFs nach dem Buchstaben 'e' suchen. Es hat die höchste Häufigkeitsverteilung, so dass Sie es wahrscheinlich in allen Dokumenten finden, die Text enthalten (es sei denn, es ist gadsby ).
z.B
Verwenden Sie eines der Textverarbeitungswerkzeuge
quelle