Jak wyszukiwać zawartość wielu plików pdf?

226

Jak mogę przeszukiwać zawartość plików PDF w katalogu / podkatalogu? Szukam narzędzi wiersza polecenia. Wygląda na to, że grepnie można wyszukiwać plików PDF.

Jestin Joy
źródło
5
Grep nie będzie działał, ponieważ PDF jest formatem binarnym, a tekst jest często kompresowany lub kodowany na różne sposoby.
Mark Stephens
4
Oto rozwiązanie GUI: Adobe Reader, patrz wikispaces.psu.edu/display/training/…
Martin Thoma
3
Czytnik Adobe działa dobrze, ale nie indeksuje; więc jeśli masz dużo plików, nastąpi to powoli. Jakieś rozwiązanie do indeksowania?
Ruby,

Odpowiedzi:

211

Twoja dystrybucja powinna zapewniać narzędzie o nazwie pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

„-” jest konieczne, aby mieć wyjście pdftotext na standardowe wyjście, a nie na pliki. --with-filenameI --label=opcje będą umieścić nazwę pliku w wyjściu grep. Opcjonalne--color flaga jest ładna i mówi grepowi, aby wyświetlał za pomocą kolorów na terminalu.

(W Ubuntu pdftotextjest dostarczany przez pakiet xpdf-utilslub poppler-utils.)

Ta metoda, przy użyciu pdftotexti grep, ma tę przewagę, pdfgrepjeśli chcesz używać funkcji GNU, grepktóre pdfgrepnie obsługują. Uwaga : pdfgrep-1.3.x obsługuje -Copcję drukowania linii kontekstu.

sjr
źródło
1
@Kurt Pfeifle Dokonana edycja „(Edytuj przez -kp-)” nie działa, ponieważ grepfiltruje nazwy drukowanych plików.
Raphael Ahrens,
@ sjr nie, chociaż pdfgreprozwiązanie jest dobre dla naprawdę szybkich i prostych wyszukiwań, często chcę uzyskać kontekst, ponieważ pojedynczy wiersz nie będzie wystarczająco pomocny - tak jak dodałem do tej odpowiedzi: na przykład możesz dodać opcja -C5 przed „twoim wzorcem” w celu włączenia 5 wierszy kontekstu do wyniku - pdfgrep nie obsługuje tego
Colin D Bennett
och, to spoko, cieszę się, że są z tego zalety, chociaż dla większości ludzi jest to mniej oczywiste
sjr
2
@sjr Dla przypomnienia: używam Ubuntu 12.10 i pdfgrepjest bezużyteczny, zgłasza ogromne ilości śmieci w plikach, których nie może obsłużyć. Z drugiej strony Twoje rozwiązanie pomogło. Dlatego nie usuwaj go, nawet po 3 latach nadal jest pomocny!
Ali
Byłem w stanie używać go również w cygwinie, chociaż aby uczynić go funkcją z parametrem, musiałem sprawić, że „twoja_pattern” zmieni się na „1 $”
Koshmaar
214

Istnieje pdfgrep , który robi dokładnie to, co sugeruje jego nazwa.

pdfgrep -R 'a pattern to search recursively from path' /some/path

Użyłem go do prostych wyszukiwań i działało dobrze.

(Istnieją pakiety w Debianie, Ubuntu i Fedorze.)

Od wersji 1.3.0 pdfgrep obsługuje wyszukiwanie rekurencyjne. Ta wersja jest dostępna w Ubuntu od Ubuntu 12.10 (Quantal).

Graeme
źródło
1
Od Natty (Ubuntu 11.04) w górę (patrz packages.ubuntu.com/... )
Martin Thoma
2
@pavon pdfgrepma teraz tę opcję rekurencji, w tym -Rtakże śledzenie dowiązań symbolicznych
Tobias Kienzler
30

Recoll to fantastyczna pełnotekstowa aplikacja do wyszukiwania GUI dla systemów Unix / Linux, która obsługuje dziesiątki różnych formatów, w tym PDF. Może nawet przekazać dokładny numer strony i wyszukiwane hasło do przeglądarki dokumentów, a tym samym umożliwia przejście do wyniku bezpośrednio z GUI.

Recoll jest również wyposażony w realistyczny interfejs wiersza poleceń i interfejs przeglądarki internetowej .

Glutanimate
źródło
1
@ Glutanimate Pomógłbym (mi i być może również innym), gdybyś mógł dodać przykład dotyczący pierwotnego pytania (narzędzie wiersza poleceń do wyszukiwania wielu plików pdf): Chciałbym również zobaczyć, jak przeprowadzić wyszukiwanie z użyciem symboli wieloznacznych i jak szukać katalog bieżący w tym wszystkie podkatalogi . Jak to wyglądałoby recoll / xapianw linii poleceń (bez GUI)? Dzięki!
orzechowy o natty
@ LeszekŻarna Być może mógłbyś zamieścić testowany przykład?
orzechowy o natty
Podręcznik recoll użytkownika może zawierać pewne wskazówki, ale oferuje raczej techniczny i „nie na temat” przeczytany ...
szalony o natty
1
@nutty: recoll -t -q katalog: pwdext: pdf 'neuro *' - stackoverflow zjadł backtyki wokół pwd.
medoc
13

Moja aktualna wersja pdfgrep (1.3.0) umożliwia:

pdfgrep -HiR 'pattern' /path

Podczas wykonywania pdfgrep --help:

  • H: Wydrukuj nazwę pliku dla każdego dopasowania.
  • i: Ignoruj ​​rozróżnienie wielkości liter.
  • R: Rekurencyjnie przeszukuj katalogi.

Działa dobrze na moim Ubuntu.

arkhi
źródło
7

Zrobiłem ten niszczycielski mały skrypt. Baw się dobrze.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}
phil
źródło
2
+1. Ale zamiast tego $filename.należy go wpiąć grep.
Raphael Ahrens,
3

Lubię odpowiedź @ sjr, jednak wolę xargs vs -exec. Uważam, że xargs jest bardziej uniwersalny. Na przykład z -P możemy wykorzystać wiele procesorów, gdy ma to sens.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Deian
źródło
interesujący punkt na temat xargsmożliwości przetwarzania równoległego. Należy pamiętać, że --labelopcja-argumentem będzie dosłownie {} , ponieważ grepkomenda jest teraz nie jest już wykonywany w kontekście find„s exec.
mklement0
2

Miałem ten sam problem i dlatego napisałem skrypt, który przeszukuje wszystkie pliki pdf w określonym folderze w poszukiwaniu łańcucha i drukuje pliki PDF, które pasują do ciągu zapytania.

Może to ci pomoże.

Możesz go pobrać tutaj

Paul Weibert
źródło
może warto umieścić skrypt w komentarzu?
baxx,
wypróbowałem twój skrypt i okazuje się, że jest dużo wolniejszy niż pdfgreprozwiązanie lub jednowierszowy sjr, i zostawił mi ciągły proces wykorzystujący 100% wątku procesora nawet po I Ctrl-C, aby go zakończyć.
Jason
2

Jeśli chcesz zobaczyć nazwy plików z pdftotext, użyj następującego polecenia:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 
Aleksey Kontsevich
źródło
2

Istnieje inne narzędzie o nazwie ripgrep-all , oparte na ripgrep .

Może obsługiwać nie tylko dokumenty PDF, takie jak dokumenty i filmy Office, a autor twierdzi, że jest szybszy niżpdfgrep .

Składnia polecenia do rekurencyjnego przeszukiwania bieżącego katalogu, a drugi ogranicza się tylko do plików PDF:

rga 'pattern' .
rga --type pdf 'pattern' .
oschoudhury
źródło
1

Istnieje narzędzie crgrep do tworzenia wspólnych zasobów typu open source plików które przeszukuje pliki PDF, ale także inne zasoby, takie jak zawartość zagnieżdżona w archiwach, tabele baz danych, metadane obrazu, zależności plików POM i zasoby sieciowe - oraz ich kombinacje, w tym wyszukiwanie rekurencyjne.

Pełny opis w zakładce Pliki obejmuje prawie wszystko, co obsługuje narzędzie.

Opracowałem crgrep jako narzędzie typu open source.

Craig
źródło
Craig - czy masz połączenie z tym projektem? Jeśli tak, powinieneś podać to w swojej odpowiedzi. Mówię to, ponieważ właśnie opublikowałeś praktycznie identyczną odpowiedź na dwa inne stare pytania ...
Stephen C
Zaktualizowany post, aby wyjaśnić, że jestem autorem crgrep
Craig
1

Najpierw przekonwertuj wszystkie pliki pdf na pliki tekstowe:

for file in *.pdf;do pdftotext "$file"; done

Następnie użyj grepjak zwykle. Jest to szczególnie dobre, ponieważ jest szybkie, gdy masz wiele zapytań i wiele plików PDF.

Martin Thoma
źródło
W połączeniu z ag github.com/ggreer/the_silver_searcher . Zdolne do parsowania w psychedelikach Gb przez mikrosekundy. Pliki płaskie na całe życie
NVRM
0

Potrzebujesz kilku narzędzi, takich jak pdf2text, aby najpierw przekonwertować pdf na plik tekstowy, a następnie przeszukać tekst. (Prawdopodobnie przegapisz niektóre informacje lub symbole).

Jeśli używasz języka programowania, prawdopodobnie są w tym celu napisane biblioteki pdf. np. http://search.cpan.org/dist/CAM-PDF/ dla Perla

Nylonowy uśmiech
źródło
0

spróbuj użyć „acroread” w prostym skrypcie, takim jak powyższy

acathur
źródło