Wie kann ich PDF-Dateien einlesen?

135

Gibt es eine Möglichkeit, PDF-Dateien mit grep zu durchsuchen, ohne zuerst in Ubuntu in Text zu konvertieren?

Dervin Thunk
quelle
1
Ich denke, Sie müssen es als pdf2-Text analysieren, um wieder brauchbare Ergebnisse zu erhalten ...
Johan
1
Für Leute, die über die Suche hierher kommen: Wenn Sie bereit sind, es zuerst in Textdateien zu konvertieren, lesen Sie Wie kann man den Inhalt mehrerer PDF-Dateien durchsuchen?
Martin Thoma

Antworten:

135

Installieren Sie das Paket pdfgrepund verwenden Sie dann den Befehl:

find /path -iname '*.pdf' -exec pdfgrep pattern {} +

——————

Der einfachste Weg ist

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
Enzotib
quelle
5
Dies funktioniert auch in Mac OSX (Mavericks). Installieren Sie es mit Brew. Einfach. Vielen Dank.
Mikiemorales
7
Aus Neugier habe ich die Quelle von pdfgrep überprüft und es verwendet Poppler, um Zeichenfolgen aus dem PDF zu extrahieren. Fast genau wie die Antwort von @wag, aber vermutlich nicht das gesamte Dokument.
Andrew Martin
4
pdfgrephat 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.
Rovanion
1
Tatsächlich ist die -nOption ein Profi für pdfgrep, da die Seitenzahl in die Ausgabe einbezogen werden kann (möglicherweise hilfreich für die weitere Verarbeitung).
10.
4
Diese Antwort wäre einfacher zu verwenden, wenn erklärt würde, welche Bits des Befehls wörtlich kopiert werden sollen und welche Platzhalter sind. Was ist pattern? Was ist {}? Was ist los mit dem "+"? Ich habe beim ersten Lesen keine Ahnung ... also gehe ich zur Manpage, nehme ich an.
Mark Amery
56

Wenn Sie poppler-utilsUbuntu 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.

wedeln
quelle
1
Also ... extrahieren Sie den Text, bevor Sie ihn abfragen, was bedeutet, dass die Antwort "nein" ist.
Akira
18
@akira Das OP bedeutete wahrscheinlich "ohne das PDF in einem Viewer zu öffnen und als Text zu exportieren"
Michael Mrozek
5
@akira Wo siehst du "grep only"?
Michael Mrozek
6
@akira Nun, ich habe bereits gesagt, was er wohl gemeint hat. Er möchte nicht in Text exportieren, bevor er ihn verarbeitet. Ich bezweifle sehr , er hat ein Problem mit jedem Befehl, der in irgendeiner Weise in Text umwandelt; Es gibt keinen Grund, es nicht zu
tun
2
@sherrellbc Das zweite Argument von pdftotextist der Dateiname, in den geschrieben werden soll. In der Regel können Sie mit Tools jedoch stdoutin eine Datei schreiben, anstatt sie mit a -zu versehen. In ähnlicher Weise würden einige Tools stdoutstandardmäßig schreiben, wenn Sie ein solches Argument vollständig weglassen (dies ist jedoch nicht immer möglich, ohne Mehrdeutigkeiten zu erzeugen).
Joost
11

pdfgrep wurde genau für diesen Zweck geschrieben und ist in Ubuntu verfügbar.

Es versucht größtenteils kompatibel zu sein grepund bietet somit "die Kraft von grep", das nur auf PDFs spezialisiert ist. Dazu gehören gemeinsame grep Optionen, wie zum Beispiel --recursive, --ignore-caseoder --color.

Im Gegensatz dazu pdftotext | grepkann pdfgrep die Seitenzahl einer Übereinstimmung performant ausgeben und ist im Allgemeinen schneller, wenn nicht das gesamte Dokument durchsucht werden muss (z . B. --max-countoder --quiet).

Die grundlegende Verwendung ist:

pdfgrep PATTERN FILE..

Wo PATTERNist Ihre Suchzeichenfolge und FILEeine Liste der Dateinamen (oder Platzhalter in einer Shell).

Weitere Informationen finden Sie auf der Manpage .

hpdeifel
quelle
7

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 pdf2textund 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 grepPDF-Dateien und hoffen auf zuverlässige Antworten, ohne den Text zuerst zu extrahieren.

Akira
quelle
5
Berücksichtigt man das pdfgrepVorhandensein (so), ist ein pauschales "Nein" falsch.
Jonathan Cross
6

Recoll kann PDFs durchsuchen. Es unterstützt keine regulären Ausdrücke, bietet jedoch viele andere Suchoptionen, sodass es möglicherweise Ihren Anforderungen entspricht.

user39336
quelle
5

Sie könnten es stringszuerst durchpfeifen : -

cat file.pdf | strings | grep <...etc...>
Andy Smith
quelle
8
Verwenden strings file.pdf | grep <...>Sie einfach , Sie brauchen nichtcat
phunehehe 31.01.11
Ja - mein Verstand scheint mit Streams besser zu funktionieren ... :-)
Andy Smith
12
funktioniert nicht, wenn der Text komprimiert ist, was meistens der Fall ist.
Akira
6
Auch wenn der Text nicht komprimiert ist, handelt es sich in der Regel um kleine Sätze (nicht unbedingt ganze Wörter!), Die mit Formatierungsinformationen fein vermischt sind. Nicht sehr freundlich für stringsoder grep.
Jander
Können Sie sich einen anderen Grund vorstellen, warum die Verwendung von Zeichenfolgen dafür nicht funktioniert? Ich habe festgestellt, dass die Verwendung von Zeichenfolgen bei einigen PDFs funktioniert, bei anderen jedoch nicht.
Rückstunde
3

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.

Craig
quelle
2

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

harish.venkat
quelle
2

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)
Rasmuss Rall
quelle
Warum um alles in der Welt verwenden Sie ls, um Dateinamen in Parameter zu setzen? Es ist nicht nur langsamer, sondern auch eine schlechte Idee, die lsAusgabe als Eingabe für andere Befehle zu verwenden . Nur pdfgrep 'pattern' *.pdfist genug
phuclv
1

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-filenameFlag 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

user7610
quelle
Ich denke, es wäre besser gewesen, dies als Kommentar (oder Änderung) in der ähnlichen Antwort zu belassen, auf die Sie sich beziehen.
Bernhard
0

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 \;
Nico
quelle
0

Ich nehme an, Sie meinen, tp konvertieren es nicht auf der Festplatte, Sie können sie konvertieren stdoutund dann mit grep pdftotext. Das Übertragen von PDFs ohne jegliche Konvertierung ist kein praktischer Ansatz, da PDFes 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 pdfum 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 grepund sie mit OCR zu versehen.

Ich habe festgestellt, dass eine pdfDatei, die keine Schriftart enthält, normalerweise nicht durchsuchbar ist. Wenn wir das wissen, können wir es nutzen pdffonts.

Die ersten pdffontsbeiden 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 {}
Eduard Florinescu
quelle
0

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
phuclv
quelle
0

Wenn Sie Gnome verwenden, ist gpdf möglicherweise genau das Richtige für Sie! Überprüfen Sie dies, falls Sie Gnome nicht verwenden. Es gibt eine Liste von CLI-PDF-Viewern. Dann können Sie verwenden grep, um ein Muster zu finden.

Dharmit
quelle