우분투에서 먼저 텍스트로 변환하지 않고 grep의 힘을 사용하여 PDF 파일을 검색하는 방법이 있습니까?
우분투에서 먼저 텍스트로 변환하지 않고 grep의 힘을 사용하여 PDF 파일을 검색하는 방법이 있습니까?
답변:
패키지를 설치 한 pdfgrep
후 다음 명령을 사용하십시오.
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
가장 간단한 방법은
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
재귀 플래그도 있습니다. 따라서이 답변은 아마도 다음과 같이 줄어들 수 있습니다 pdfgrep -R pattern /path/
. PDF가 아니더라도 모든 파일을 통과하면 효과가 떨어질 수 있습니다. 그리고 å, ä 및 ö와 같은 국제 문자에 문제가 있음을 알았습니다.
-n
옵션은 출력에 페이지 번호를 포함시킬 수 있으므로 pdfgrep의 전문가입니다 (추가 처리에 도움이 될 수 있음).
pattern
? 무엇입니까 {}
? `+`는 무엇입니까? 나는 처음 읽었을 때 전혀 모른다 ... 그래서 나는 맨 페이지로 가야한다고 생각한다.
당신이 한 경우 poppler-utils
(우분투 바탕 화면에 기본) 설치, 당신의 비행 및 파이프 그것을 그것을 "변환"수 grep
:
pdftotext my.pdf - | grep 'pattern'
.txt 파일은 생성되지 않습니다.
pdftotext
는 쓸 파일 이름입니다. 그러나 일반적으로 도구를 사용하면 stdout
대신 대신 파일을 지정하여 파일에 쓸 수 있습니다 -
. 마찬가지로 일부 stdout
인수는 이러한 인수를 완전히 생략하면 기본적으로 작성 되지만 모호성을 작성하지 않고 항상 가능한 것은 아닙니다.
pdfgrep 은 정확히이 목적으로 작성되었으며 우분투에서 구할 수 있습니다.
대부분 grep
PDF와 호환되도록 "grep의 힘"과 호환되도록 노력합니다 . 즉 같은 일반적인 그렙 옵션을 포함 --recursive
, --ignore-case
또는 --color
.
pdftotext | grep
pdfgrep과는 달리 , pdfgrep은 일치하는 방식으로 페이지 번호를 출력 할 수 있으며 전체 문서 (예 : --max-count
또는 --quiet
) 를 검색 할 필요가 없을 때 일반적으로 더 빠릅니다 .
기본 사용법은 다음과 같습니다.
pdfgrep PATTERN FILE..
여기서 PATTERN
검색 문자열과 FILE
파일 이름 목록 (또는 쉘의 와일드 카드)이 있습니다.
자세한 내용은 맨 페이지 를 참조하십시오 .
아니.
pdf는 데이터 덩어리, 일부는 텍스트, 일부는 그림 및 일부는 정말 멋진 XYZ (예 : .u3d 파일)로 구성됩니다. 이러한 청크는 대부분 압축 된 시간입니다 (예 : 플랫, http://www.verypdf.com/pdfinfoeditor/compression.htm 확인 ). '그렙'는 .PDF하기 위해 당신은 이 압축 일명 반전 텍스트를 추출 할 수 있습니다.
pdf2text
결과와 같은 도구를 사용하여 파일별로 결과를 얻 거나 .pdf 파일에서 검색 가능한 색인을 작성하는 'indexer'( xapian.org 또는 lucene 참조 )를 실행 한 다음 검색을 사용할 수 있습니다 해당 인덱서의 엔진 도구를 사용하여 pdf의 내용을 가져옵니다.
그러나 아니요, grep
파일을 PDF로 작성할 수 없으며 텍스트를 먼저 추출하지 않고도 신뢰할 수있는 답변을 기대할 수 있습니다 .
pdfgrep
존재 함 (위 참조)을 고려할 때 플랫 "아니오"는 올바르지 않습니다.
당신은 strings
먼저 그것을 통해 파이프 수 있습니다 :-
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
하면 필요하지 않습니다cat
strings
나 에게 매우 친절하지 않습니다 grep
.
이 시도
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
선을 인쇄하기 위해 패턴이 pdf 내부에서 발생합니다
pdf 파일이 들어있는 폴더로 CD를 넣습니다.
pdfgrep 'pattern' your.pdf
또는 하나 이상의 pdf 파일을 검색하려는 경우 (예 : 폴더의 모든 pdf 파일)
pdfgrep 'pattern' `ls *.pdf`
또는
pdfgrep 'pattern' $(ls *.pdf)
ls
하는 것은 느릴뿐만 아니라 나쁜 생각 입니다. 그냥 pdfgrep 'pattern' *.pdf
충분합니다
StackOverflow에 중복 질문이 있습니다. 사람들은 harish.venkarts의 변형을 제안합니다.
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
비슷한 답변보다 장점 --with-filename
은 grep 플래그입니다. 표준 grep에 더 많은 기능이 있기 때문에 pdfgrep보다 다소 우수합니다.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
난 당신이 TP는 디스크에 변환 할 말은 가정, 당신은으로 변환 할 수 있습니다 stdout
다음과 grep을 pdftotext
. 어떤 종류의 변환없이 pdf를 가져 오는 것은 실용적인 방법이 아닙니다 PDF
. 대부분 바이너리 형식 이기 때문 입니다.
디렉토리에서 :
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
또는 디렉토리 및 해당 서브 디렉토리에서 :
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
또한 일부 pdf
는 스캔 이므로 먼저 OCR을 수행해야합니다. 나는 grep
편집 할 수없는 모든 PDF를 검색 하고 OCR 할 수있는 아주 간단한 방법을 썼습니다 .
있을지 주목 pdf
파일은 일반적으로 검색 할 수 없습니다 어떤 글꼴이 없습니다. 이것을 알면 사용할 수 있습니다 pdffonts
.
의 첫 두 줄은 pdffonts
표 머리글이므로 파일을 검색 할 수있을 때 두 줄 이상의 출력이 있으면이를 알 수 있습니다.
gedit check_pdf_searchable.sh
그런 다음 붙여 넣기
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
그런 다음 실행 가능하게하십시오.
chmod +x check_pdf_searchable.sh
그런 다음 디렉토리에 검색 할 수없는 모든 PDF를 나열하십시오.
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
또는 디렉토리 및 해당 서브 디렉토리에서 :
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
pdf 이름 / 속성 ... 또는 압축되거나 인코딩되지 않은 간단한 문자열을 검색하려는 경우 대신 다음을 strings
사용할 수 있습니다
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
보낸 사람 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
그리고 cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB