PDF 파일을 어떻게 grep 할 수 있습니까?


135

우분투에서 먼저 텍스트로 변환하지 않고 grep의 힘을 사용하여 PDF 파일을 검색하는 방법이 있습니까?


1
유용한 결과를 다시 얻으려면 pdf2text로 구문 분석해야한다고 생각합니다.
Johan


1
검색을 통해 여기에 오는 사람들의 경우 : 먼저 텍스트 파일로 변환하려는 경우 여러 pdf 파일의 내용을 검색하는 방법을
Martin Thoma

답변:


135

패키지를 설치 한 pdfgrep후 다음 명령을 사용하십시오.

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

——————

가장 간단한 방법은

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 

5
이것은 맥 OSX (매버릭스)에서도 작동합니다. 추출기를 사용하여 설치하십시오. 단순한. 감사.
mikiemorales

7
호기심으로 pdfgrep의 출처를 확인했으며 poppler를 사용하여 pdf에서 문자열을 추출합니다. @wag의 대답과 거의 동일하게 전체 문서가 아닌 페이지 단위로 답변됩니다.
Andrew Martin

4
pdfgrep재귀 플래그도 있습니다. 따라서이 답변은 아마도 다음과 같이 줄어들 수 있습니다 pdfgrep -R pattern /path/. PDF가 아니더라도 모든 파일을 통과하면 효과가 떨어질 수 있습니다. 그리고 å, ä 및 ö와 같은 국제 문자에 문제가 있음을 알았습니다.
Rovanion

1
실제로이 -n옵션은 출력에 페이지 번호를 포함시킬 수 있으므로 pdfgrep의 전문가입니다 (추가 처리에 도움이 될 수 있음).
JepZ

4
이 답변은 명령의 어떤 비트가 문자 그대로 복사되고 어떤 것이 자리 표시 자인지 설명하면 사용하기가 더 쉬울 것입니다. 무엇입니까 pattern? 무엇입니까 {}? `+`는 무엇입니까? 나는 처음 읽었을 때 전혀 모른다 ... 그래서 나는 맨 페이지로 가야한다고 생각한다.
Mark Amery

56

당신이 한 경우 poppler-utils(우분투 바탕 화면에 기본) 설치, 당신의 비행 및 파이프 그것을 그것을 "변환"수 grep:

pdftotext my.pdf - | grep 'pattern'

.txt 파일은 생성되지 않습니다.


1
그래서 .. 당신은 텍스트를 grep하기 전에 텍스트를 추출합니다. 이것은 대답이 "아니오"임을 의미합니다.
akira

18
@akira OP는 아마도 "뷰어에서 PDF를 열지 않고 텍스트로 내 보내지 않고"를 의미했을 것입니다.
Michael Mrozek

5
@akira "grep only"는 어디에 있습니까?
Michael Mrozek

6
@akira 글쎄, 나는 그가 생각하는 바를 이미 말했다; 그는 처리하기 전에 텍스트로 내보내고 싶지 않습니다. 나는 그가 어떤 식 으로든 텍스트로 변환 하는 명령에 문제가 있다고 의심 합니다. 하지 말아야 할 이유가 없습니다
Michael Mrozek

2
@sherrellbc 두 번째 인수 pdftotext는 쓸 파일 이름입니다. 그러나 일반적으로 도구를 사용하면 stdout대신 대신 파일을 지정하여 파일에 쓸 수 있습니다 -. 마찬가지로 일부 stdout인수는 이러한 인수를 완전히 생략하면 기본적으로 작성 되지만 모호성을 작성하지 않고 항상 가능한 것은 아닙니다.
Joost

11

pdfgrep 은 정확히이 목적으로 작성되었으며 우분투에서 구할 수 있습니다.

대부분 grepPDF와 호환되도록 "grep의 힘"과 호환되도록 노력합니다 . 즉 같은 일반적인 그렙 옵션을 포함 --recursive, --ignore-case또는 --color.

pdftotext | greppdfgrep과는 달리 , pdfgrep은 일치하는 방식으로 페이지 번호를 출력 할 수 있으며 전체 문서 (예 : --max-count또는 --quiet) 를 검색 할 필요가 없을 때 일반적으로 더 빠릅니다 .

기본 사용법은 다음과 같습니다.

pdfgrep PATTERN FILE..

여기서 PATTERN검색 문자열과 FILE파일 이름 목록 (또는 쉘의 와일드 카드)이 있습니다.

자세한 내용은 맨 페이지 를 참조하십시오 .


7

아니.

pdf는 데이터 덩어리, 일부는 텍스트, 일부는 그림 및 일부는 정말 멋진 XYZ (예 : .u3d 파일)로 구성됩니다. 이러한 청크는 대부분 압축 된 시간입니다 (예 : 플랫, http://www.verypdf.com/pdfinfoeditor/compression.htm 확인 ). '그렙'는 .PDF하기 위해 당신은 압축 일명 반전 텍스트를 추출 할 수 있습니다.

pdf2text결과와 같은 도구를 사용하여 파일별로 결과를 거나 .pdf 파일에서 검색 가능한 색인을 작성하는 'indexer'( xapian.org 또는 lucene 참조 )를 실행 한 다음 검색을 사용할 수 있습니다 해당 인덱서의 엔진 도구를 사용하여 pdf의 내용을 가져옵니다.

그러나 아니요, grep파일을 PDF로 작성할 수 없으며 텍스트를 먼저 추출하지 않고도 신뢰할 수있는 답변을 기대할 수 있습니다 .


5
pdfgrep존재 함 (위 참조)을 고려할 때 플랫 "아니오"는 올바르지 않습니다.
Jonathan Cross

6

Recoll 은 PDF를 검색 할 수 있습니다. 정규식은 지원하지 않지만 다른 검색 옵션이 많이 있으므로 필요에 맞을 수 있습니다.


5

당신은 strings먼저 그것을 통해 파이프 수 있습니다 :-

cat file.pdf | strings | grep <...etc...>

8
그냥 사용 strings file.pdf | grep <...>하면 필요하지 않습니다cat
phunehehe

그래-내 마음은 스트림과 더 잘 작동하는 것 같습니다 ... :-)
Andy Smith

12
텍스트가 압축되어 있으면 대부분 작동하지 않습니다.
akira

6
텍스트가 압축되지 않은 경우에도 일반적으로 서식 정보와 잘 혼합 된 작은 문장들입니다 (반드시 전체 단어 일 필요는 없습니다!). strings나 에게 매우 친절하지 않습니다 grep.
Jander

문자열을 사용하는 것이 효과가없는 다른 이유를 생각할 수 있습니까? 문자열 사용은 일부 PDF에서는 작동하지만 다른 PDF에서는 작동하지 않는다는 것을 알았습니다.
hourback

3

PDF 파일 내 검색을 지원 하는 공통 자원 그렙 도구 crgrep 를 살펴보십시오 .

또한 아카이브, 데이터베이스 테이블, 이미지 메타 데이터, POM 파일 종속성 및 웹 자원에 중첩 된 컨텐츠와 같은 다른 자원과 재귀 검색을 포함한 이들의 조합을 검색 할 수 있습니다.


2

이 시도

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
    pdftotext "$i" - | grep pattern; done

선을 인쇄하기 위해 패턴이 pdf 내부에서 발생합니다


2

pdf 파일이 들어있는 폴더로 CD를 넣습니다.

pdfgrep 'pattern' your.pdf

또는 하나 이상의 pdf 파일을 검색하려는 경우 (예 : 폴더의 모든 pdf 파일)

pdfgrep 'pattern'  `ls *.pdf`

또는

pdfgrep 'pattern' $(ls *.pdf)

왜 지구상에서 ls를 사용하여 파일 이름을 매개 변수에 넣습니까? 출력을 다른 명령의 입력으로 사용ls 하는 것은 느릴뿐만 아니라 나쁜 생각 입니다. 그냥 pdfgrep 'pattern' *.pdf충분합니다
phuclv

1

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


나는 당신이 말하는 비슷한 대답에서 이것을 주석 (또는 편집)으로 남겨 두는 것이 좋을 것이라고 생각합니다.
Bernhard

0

현재 디렉토리에서 pdf를 검색하는 빠른 스크립트는 다음과 같습니다.

#!/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 \;

0

난 당신이 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 {}

0

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

0

Gnome을 사용하는 경우 gpdf가 필요할 수 있습니다! Gnome을 사용하지 않는 경우 이를 확인하십시오 . CLI pdf 뷰어 목록이 있습니다. 그런 다음 grep패턴을 찾는 데 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.