Czy istnieje sposób wyszukiwania plików pdf za pomocą grep, bez konwersji do tekstu w systemie Ubuntu?
Czy istnieje sposób wyszukiwania plików pdf za pomocą grep, bez konwersji do tekstu w systemie Ubuntu?
Odpowiedzi:
Zainstaluj pakiet pdfgrep
, a następnie użyj polecenia:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
Najprościej jest
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
ma również flagę rekurencyjną. Więc to może być odpowiedź może być skrócony do: pdfgrep -R pattern /path/
. Chociaż może być mniej skuteczny, jeśli przejdzie przez każdy plik, nawet jeśli nie jest to plik PDF. Zauważam, że ma problemy ze znakami międzynarodowymi, takimi jak å, ä i ö.
-n
opcja ta jest pro dla pdfgrep, ponieważ pozwala dołączyć numer strony do wyniku (może być pomocny w dalszym przetwarzaniu).
pattern
? Co jest {}
? O co chodzi z `+`? Po pierwszym czytaniu nie mam pojęcia ... więc chyba idę do strony podręcznika.
Jeśli masz poppler-utils
zainstalowany (domyślnie na Ubuntu Desktop), możesz go „przekonwertować” w locie i potokować do grep
:
pdftotext my.pdf - | grep 'pattern'
To nie utworzy pliku .txt.
pdftotext
jest nazwa pliku, do którego powinien zapisać. Jednak, zgodnie z konwencją, narzędzia zazwyczaj pozwalają na pisanie do stdout
pliku zamiast do pliku poprzez podanie -
zamiast niego. Podobnie niektóre narzędzia zapisują stdout
domyślnie, jeśli całkowicie pominie się taki argument (ale nie zawsze jest to możliwe bez tworzenia niejednoznaczności).
pdfgrep został napisany właśnie w tym celu i jest dostępny w Ubuntu.
Stara się być w większości kompatybilny, grep
a tym samym zapewnia „moc grep”, specjalizującą się tylko w plikach PDF. Która obejmuje wspólne opcje grep, takie jak --recursive
, --ignore-case
lub --color
.
W przeciwieństwie do pdftotext | grep
pdfgrep może wypisać numer strony dopasowania w wydajny sposób i generalnie jest szybszy, gdy nie musi przeszukiwać całego dokumentu (np. --max-count
Lub --quiet
).
Podstawowym zastosowaniem jest:
pdfgrep PATTERN FILE..
gdzie PATTERN
jest szukany ciąg i FILE
lista nazw plików (lub symboli wieloznacznych w powłoce).
Zobacz manpage cej informacje o.
Nie.
Plik pdf składa się z fragmentów danych, niektórych tekstów, niektórych zdjęć, a niektóre naprawdę magicznych, fantazyjnych XYZ (np. Plików .u3d). Te fragmenty są w większości skompresowane (np. Płaskie, sprawdź http://www.verypdf.com/pdfinfoeditor/compression.htm ). Aby „grep” .pdf trzeba odwrócić kompresję, czyli wyodrębnić tekst.
Możesz to zrobić albo dla każdego pliku za pomocą narzędzi, takich jak pdf2text
i grep, lub uruchomić „indeksator” (spójrz na xapian.org lub lucene ), który buduje indeks z plików pdf do przeszukiwania, a następnie możesz użyć wyszukiwania narzędzia silnikowe tego indeksatora, aby uzyskać zawartość pliku pdf.
Ale nie, nie można grep
pdfować plików i mieć nadzieję na wiarygodne odpowiedzi bez uprzedniego wyodrębnienia tekstu.
pdfgrep
istnieje (patrz wyżej), płaskie „nie” jest nieprawidłowe.
Recoll może wyszukiwać pliki PDF. Nie obsługuje wyrażeń regularnych, ale ma wiele innych opcji wyszukiwania, więc może pasować do twoich potrzeb.
Możesz strings
najpierw przepuścić przez : -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, nie potrzebujeszcat
strings
lub grep
.
Spójrz na wspólne narzędzie crgrep grep zasobów, które obsługuje wyszukiwanie w plikach PDF.
Umożliwia także wyszukiwanie innych zasobów, takich jak zawartość zagnieżdżona w archiwach, tabele bazy danych, metadane obrazu, zależności plików POM i zasoby sieciowe - oraz ich kombinacje, w tym wyszukiwanie rekurencyjne.
Spróbuj tego
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
do drukowania linii wzór pojawia się w pliku pdf
cd do twojego folderu zawierającego plik pdf, a następnie ...
pdfgrep 'pattern' your.pdf
lub jeśli chcesz wyszukać więcej niż jeden plik pdf (np. we wszystkich plikach pdf w swoim folderze)
pdfgrep 'pattern' `ls *.pdf`
lub
pdfgrep 'pattern' $(ls *.pdf)
ls
danych wyjściowych jako danych wejściowych do innych poleceń jest nie tylko wolniejsze, ale również złym pomysłem . Po prostu pdfgrep 'pattern' *.pdf
wystarczy
W StackOverflow istnieje zduplikowane pytanie. Ludzie tam sugerują odmianę harish.venkarts odpowiedzi:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Przewagą nad podobną odpowiedzią jest --with-filename
flaga grep. Jest to nieco lepsze niż pdfgrep, ponieważ standardowy grep ma więcej funkcji.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Zakładam, że masz na myśli, że tp nie konwertuje go na dysk, możesz przekonwertować je na, stdout
a następnie grep go pdftotext
. Grepowanie pdf bez jakiejkolwiek konwersji nie jest praktycznym podejściem, ponieważ PDF
jest to głównie format binarny.
W katalogu:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
lub w katalogu i jego podkatalogach:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Ponieważ niektóre pdf
są skanami, najpierw należy je OCRed. Napisałem dość prosty sposób na przeszukiwanie wszystkich plików PDF, których nie można grep
edytować i ich OCR.
Zauważyłem, że jeśli pdf
plik nie ma żadnej czcionki, zwykle nie można go przeszukiwać. Wiedząc o tym, możemy skorzystać pdffonts
.
Pierwsze 2 wiersze pdffonts
nagłówka tabeli, więc gdy plik do przeszukiwania ma więcej niż dwa wiersze, wiedząc, że możemy to utworzyć:
gedit check_pdf_searchable.sh
następnie wklej to
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
następnie uczyń go wykonywalnym
chmod +x check_pdf_searchable.sh
następnie wypisz wszystkie nieprzeszukiwalne pliki pdf w katalogu:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
lub w katalogu i jego podkatalogach:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Jeśli chcesz po prostu wyszukać nazwy / właściwości pdf ... lub proste ciągi, które nie są kompresowane ani kodowane, zamiast tego strings
możesz użyć poniższych
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
Od 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
i cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB