Gibt es eine Möglichkeit, PDF-Dateien mit grep zu durchsuchen, ohne zuerst in Ubuntu in Text zu konvertieren?
Gibt es eine Möglichkeit, PDF-Dateien mit grep zu durchsuchen, ohne zuerst in Ubuntu in Text zu konvertieren?
Antworten:
Installieren Sie das Paket pdfgrep
und verwenden Sie dann den Befehl:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
Der einfachste Weg ist
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
hat auch eine rekursive Flagge. So könnte diese Antwort vielleicht reduziert werden: pdfgrep -R pattern /path/
. Es ist jedoch möglicherweise weniger effektiv, wenn jede Datei durchsucht wird, auch wenn es sich nicht um eine PDF-Datei handelt. Und ich stelle fest, dass es Probleme mit internationalen Zeichen wie å, ä und ö gibt.
-n
Option ein Profi für pdfgrep, da die Seitenzahl in die Ausgabe einbezogen werden kann (möglicherweise hilfreich für die weitere Verarbeitung).
pattern
? Was ist {}
? Was ist los mit dem "+"? Ich habe beim ersten Lesen keine Ahnung ... also gehe ich zur Manpage, nehme ich an.
Wenn Sie poppler-utils
Ubuntu Desktop installiert haben (Standardeinstellung auf Ubuntu Desktop), können Sie es im Handumdrehen "konvertieren" und an folgende Adresse weiterleiten grep
:
pdftotext my.pdf - | grep 'pattern'
Dadurch wird keine TXT-Datei erstellt.
pdftotext
ist der Dateiname, in den geschrieben werden soll. In der Regel können Sie mit Tools jedoch stdout
in eine Datei schreiben, anstatt sie mit a -
zu versehen. In ähnlicher Weise würden einige Tools stdout
standardmäßig schreiben, wenn Sie ein solches Argument vollständig weglassen (dies ist jedoch nicht immer möglich, ohne Mehrdeutigkeiten zu erzeugen).
pdfgrep wurde genau für diesen Zweck geschrieben und ist in Ubuntu verfügbar.
Es versucht größtenteils kompatibel zu sein grep
und bietet somit "die Kraft von grep", das nur auf PDFs spezialisiert ist. Dazu gehören gemeinsame grep Optionen, wie zum Beispiel --recursive
, --ignore-case
oder --color
.
Im Gegensatz dazu pdftotext | grep
kann pdfgrep die Seitenzahl einer Übereinstimmung performant ausgeben und ist im Allgemeinen schneller, wenn nicht das gesamte Dokument durchsucht werden muss (z . B. --max-count
oder --quiet
).
Die grundlegende Verwendung ist:
pdfgrep PATTERN FILE..
Wo PATTERN
ist Ihre Suchzeichenfolge und FILE
eine Liste der Dateinamen (oder Platzhalter in einer Shell).
Weitere Informationen finden Sie auf der Manpage .
Nein.
Ein PDF besteht aus Datenblöcken, von denen einige Text, einige Bilder und einige wirklich magische XYZ-Dateien (z. B. .u3d-Dateien) sind. Diese Chunks sind meistens komprimiert (z. B. flat, siehe http://www.verypdf.com/pdfinfoeditor/compression.htm ). Um eine PDF-Datei zu "greifen", müssen Sie die Komprimierung umkehren und den Text extrahieren.
Sie können dies entweder per Datei mit Tools wie pdf2text
und grep des Ergebnisses tun , oder Sie führen einen 'Indexer' (siehe xapian.org oder lucene ) aus, der aus Ihren PDF-Dateien einen durchsuchbaren Index erstellt, und dann können Sie die Suche verwenden Engine-Tools dieses Indexers, um den Inhalt des PDF-Dokuments abzurufen.
Aber nein, Sie können keine grep
PDF-Dateien und hoffen auf zuverlässige Antworten, ohne den Text zuerst zu extrahieren.
pdfgrep
Vorhandensein (so), ist ein pauschales "Nein" falsch.
Sie könnten es strings
zuerst durchpfeifen : -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
Sie einfach , Sie brauchen nichtcat
strings
oder grep
.
Werfen Sie einen Blick auf das allgemeine Ressourcentool grep crgrep, das die Suche in PDF-Dateien unterstützt.
Sie können auch andere Ressourcen durchsuchen, z. B. in Archiven verschachtelte Inhalte, Datenbanktabellen, Bild-Metadaten, POM-Datei-Abhängigkeiten und Webressourcen - und Kombinationen davon, einschließlich rekursiver Suche.
Versuche dies
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
zum drucken der zeilen erscheint das muster im pdf
cd in ihren ordner mit ihrer pdf-datei und dann ..
pdfgrep 'pattern' your.pdf
oder wenn Sie in mehr als einer pdf-Datei suchen möchten (zB in allen pdf-Dateien in Ihrem Ordner)
pdfgrep 'pattern' `ls *.pdf`
oder
pdfgrep 'pattern' $(ls *.pdf)
ls
Ausgabe als Eingabe für andere Befehle zu verwenden . Nur pdfgrep 'pattern' *.pdf
ist genug
Es gibt eine doppelte Frage zu StackOverflow. Die Leute dort schlagen eine Variante von harish.venkarts vor. Antwort:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Der Vorteil gegenüber der ähnlichen Antwort ist hier das --with-filename
Flag für grep. Dies ist auch pdfgrep etwas überlegen, da das Standard-grep mehr Funktionen hat.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Hier ist ein schnelles Skript für die Suche nach PDF im aktuellen Verzeichnis:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage $0 VALUE" 1>&2
exit 1
fi
echo 'SEARCH IS CASE SENSITIVE' 1>&2
find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;
Ich nehme an, Sie meinen, tp konvertieren es nicht auf der Festplatte, Sie können sie konvertieren stdout
und dann mit grep pdftotext
. Das Übertragen von PDFs ohne jegliche Konvertierung ist kein praktischer Ansatz, da PDF
es sich meist um Binärformate handelt.
Im Verzeichnis:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
oder im Verzeichnis und seinen Unterverzeichnissen:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Auch weil es sich bei einigen pdf
um Scans handelt, müssen sie zuerst mit OCR versehen werden. Ich habe einen ziemlich einfachen Weg geschrieben, um alle PDFs, die nicht bearbeitet werden können, zu durchsuchen grep
und sie mit OCR zu versehen.
Ich habe festgestellt, dass eine pdf
Datei, die keine Schriftart enthält, normalerweise nicht durchsuchbar ist. Wenn wir das wissen, können wir es nutzen pdffonts
.
Die ersten pdffonts
beiden Zeilen des sind die Tabellenüberschriften. Wenn also eine Datei durchsucht werden kann, werden mehr als zwei Zeilen ausgegeben.
gedit check_pdf_searchable.sh
Dann fügen Sie diese ein
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
dann mach es ausführbar
chmod +x check_pdf_searchable.sh
Listen Sie dann alle nicht durchsuchbaren PDFs im Verzeichnis auf:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
oder im Verzeichnis und seinen Unterverzeichnissen:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Wenn Sie nur nach PDF-Namen / -Eigenschaften suchen möchten ... oder nach einfachen Zeichenfolgen, die nicht komprimiert oder codiert sind strings
, können Sie stattdessen die folgenden verwenden
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
Von grep --help
:
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
und cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB