मैं पीडीएफ फाइलों में कैसे grep कर सकता हूं?


135

क्या उबंटू में पहले पाठ में कनवर्ट किए बिना, grep की शक्ति का उपयोग करके पीडीएफ फाइलों को खोजने का एक तरीका है?


1
मुझे लगता है कि आपको कुछ उपयोगी परिणाम वापस पाने के लिए आपको इसे pdf2text को पार्स करने की आवश्यकता है ...
जोहान


1
खोज के माध्यम से यहां आने वाले लोगों के लिए: यदि आप इसे पहली बार पाठ फ़ाइलों में बदलने के लिए तैयार हैं, तो एक नज़र रखें कि एकाधिक पीडीएफ फाइलों की सामग्री कैसे खोजें?
मार्टिन थोमा

जवाबों:


135

पैकेज स्थापित करें pdfgrep, फिर कमांड का उपयोग करें:

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

------

सबसे सरल तरीका है

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

5
यह मैक ओएसएक्स (मावेरिक्स) में भी काम करता है। काढ़ा का उपयोग कर इसे स्थापित करें। सरल। धन्यवाद।
मिकेमोरेल्स

7
जिज्ञासा से बाहर मैंने pdfgrep के स्रोत की जाँच की और यह पीडीएफ से तार निकालने के लिए पॉप्लर का उपयोग करता है। लगभग वैसा ही @ वैग का जवाब केवल पृष्ठवार के बजाय, संभवतः, संपूर्ण दस्तावेज़।
एंड्रयू मार्टिन

4
pdfgrepएक पुनरावर्ती ध्वज भी है। तो इस उत्तर को शायद कम किया जा सकता है pdfgrep -R pattern /path/:। हालांकि यह कम प्रभावी हो सकता है अगर यह हर फाइल के माध्यम से जाता है, भले ही यह पीडीएफ न हो। और मुझे लगता है कि यह å, ä और ö जैसे अंतरराष्ट्रीय पात्रों के साथ मुद्दे हैं।
रोवनीयन

1
वास्तव में, -nविकल्प pdfgrep के लिए एक समर्थक है क्योंकि यह आउटपुट में पृष्ठ संख्या को शामिल करने की अनुमति देता है (आगे की प्रक्रिया के लिए सहायक हो सकता है)।
जेपीजेड

4
इस उत्तर का उपयोग करना आसान होगा यदि यह समझाया जाए कि कमांड के कौन से बिट्स शाब्दिक रूप से कॉपी किए गए हैं और जो प्लेसहोल्डर हैं। क्या है pattern? क्या है {}? `+ 'के साथ क्या हो रहा है? मुझे पहले पढ़ने पर कोई विचार नहीं है ... इसलिए मैं जिस मैनपेज पर जाता हूं, वह मुझे लगता है।
मार्क एमी

56

यदि आपने poppler-utils(उबंटू डेस्कटॉप पर डिफ़ॉल्ट) स्थापित किया है, तो आप इसे "कन्वर्ट" मक्खी पर कर सकते हैं और इसे इसमें डाल सकते हैं grep:

pdftotext my.pdf - | grep 'pattern'

यह एक .txt फ़ाइल नहीं बनाएगा।


1
इसलिए .. आप पाठ को निकालने से पहले उसे पकड़ लेते हैं जिसका अर्थ है कि उत्तर "नहीं" है।
अकीरा

18
@akira ओपी शायद "एक दर्शक में पीडीएफ खोलने और पाठ के लिए निर्यात के बिना" का मतलब है
माइकल Mrozek

5
@akira आपको "केवल grep" कहाँ दिखाई देता है?
माइकल Mrozek

6
@ अकीरा खैर, मैंने पहले ही कहा कि मुझे क्या लगता है कि वह शायद मतलब है; वह इसे संसाधित करने से पहले पाठ को निर्यात नहीं करना चाहता है। मुझे बहुत संदेह है कि उसे किसी भी आदेश के साथ समस्या है जो किसी भी तरह से पाठ में परिवर्तित करता है; वहाँ कोई कारण नहीं है नहीं करने के लिए
माइकल Mrozek

2
@sherrellbc का दूसरा तर्क pdftotextयह फ़ाइल नाम है जिसे इसे लिखना चाहिए। हालाँकि, कन्वेंशन द्वारा, टूल आमतौर पर आपको stdoutफ़ाइल के बजाय लिखने के बजाय लिखने की अनुमति देते हैं -। इसी तरह, कुछ उपकरण stdoutडिफ़ॉल्ट रूप से लिखते हैं यदि आप इस तरह के तर्क को पूरी तरह से छोड़ देते हैं (लेकिन यह हमेशा अस्पष्टता पैदा किए बिना संभव नहीं है)।
जोस्ट

11

pdfgrep को इस उद्देश्य के लिए लिखा गया था और यह उबंटू में उपलब्ध है।

यह ज्यादातर संगत होने की कोशिश करता है grepऔर इस तरह "grep की शक्ति" प्रदान करता है, केवल PDF के लिए विशेष। जिसमें सामान्य grep विकल्प शामिल हैं, जैसे कि --recursive, --ignore-caseया --color

इसके विपरीत pdftotext | grep, pdfgrep एक मैच के पेज नंबर को एक शानदार तरीके से आउटपुट कर सकता है और आम तौर पर तेजी से होता है जब इसे पूरे दस्तावेज़ (जैसे --max-countया --quiet) को खोजना नहीं पड़ता है ।

मूल उपयोग है:

pdfgrep PATTERN FILE..

PATTERNआपकी खोज स्ट्रिंग और FILEफ़ाइल नाम (या शेल में वाइल्डकार्ड) की सूची कहां है ।

अधिक जानकारी के लिए मैनपेज देखें ।


7

नहीं।

एक पीडीएफ में डेटा का एक हिस्सा होता है, उनमें से कुछ पाठ, उनमें से कुछ चित्र और उनमें से कुछ वास्तव में जादुई फैंसी XY (जैसे .u3d फाइलें) होते हैं। वे हिस्सा अधिकतर संकुचित होते हैं (उदाहरण के लिए, सपाट, जाँच http://www.verypdf.com/pdfinfoeditor/compression.htm )। 'ग्रेप' एक .pdf के लिए आपके पास है संपीड़न उर्फ रिवर्स पाठ निकालने के लिए।

आप है कि या तो प्रति उपकरणों के साथ फ़ाइल जैसे कर सकते हैं pdf2textआप एक 'इंडेक्सर' (देखो चलाने के लिए और परिणाम grep, या xapian.org या Lucene ) जो अपने .pdf फ़ाइल के बाहर एक खोज करने योग्य अनुक्रमणिका बनाता है और फिर आप खोज का उपयोग कर सकते pdf के कंटेंट को प्राप्त करने के लिए उस इंडेक्सर के इंजन टूल।

लेकिन नहीं, आप grepपीडीएफ फाइलों को पहले टेक्स्ट को निकाले बिना विश्वसनीय उत्तर की उम्मीद नहीं कर सकते ।


5
ध्यान में रखते हुए pdfgrep(ऊपर देखें) मौजूद है, एक फ्लैट "नहीं" गलत है।
जोनाथन क्रॉस

6

रिकॉल पीडीएफ खोज सकते हैं। यह नियमित अभिव्यक्तियों का समर्थन नहीं करता है, लेकिन इसमें बहुत सारे अन्य खोज विकल्प हैं, इसलिए यह आपकी आवश्यकताओं के अनुरूप हो सकता है।


5

आप इसे stringsपहले के माध्यम से पाइप कर सकते हैं : -

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

8
बस का उपयोग करें strings file.pdf | grep <...>, आप की जरूरत नहीं हैcat
phunehehe

हाँ - मेरा मन धाराओं के साथ बेहतर काम करने के लिए लगता है ... :-)
एंडी स्मिथ

12
यदि पाठ संपीड़ित है, तो यह काम नहीं करेगा।
अकीरा

6
यहां तक ​​कि अगर पाठ असम्पीडित है, तो यह आम तौर पर वाक्यों के छोटे-छोटे टुकड़े होते हैं (जरूरी नहीं कि पूरे शब्द भी!) स्वरूपण की जानकारी के साथ बारीक से बारीक। stringsया के लिए बहुत अनुकूल नहीं है grep
जेंडर

क्या आप किसी अन्य कारण के बारे में सोच सकते हैं कि इसके लिए तार का उपयोग क्यों नहीं होगा? मैंने पाया कि स्ट्रिंग्स का उपयोग कुछ पीडीएफ पर काम करता है, लेकिन दूसरों पर नहीं।
19

3

सामान्य संसाधन grep उपकरण crgrep पर एक नज़र डालें जो PDF फ़ाइलों के भीतर खोज का समर्थन करता है।

यह अभिलेखागार, डेटाबेस तालिकाओं, छवि मेटा-डेटा, पोम फ़ाइल निर्भरताओं और वेब संसाधनों में निहित सामग्री जैसे अन्य संसाधनों को खोजने की अनुमति देता है - और पुनरावर्ती खोज सहित इनमें से संयोजन।


2

इसे इस्तेमाल करे

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

लाइनों को प्रिंट करने के लिए पैटर्न पीडीएफ के अंदर होता है


2

cd आपके फ़ोल्डर में आपकी पीडीएफ-फाइल और फिर ।।

pdfgrep 'pattern' your.pdf

या यदि आप केवल एक से अधिक पीडीएफ-फाइल में खोज करना चाहते हैं (जैसे आपके फ़ोल्डर में सभी पीडीएफ-फाइलों में)

pdfgrep 'pattern'  `ls *.pdf`

या

pdfgrep 'pattern' $(ls *.pdf)

पृथ्वी पर आप मापदंडों में फ़ाइल नाम रखने के लिए ls का उपयोग क्यों करते हैं? यह न केवल धीमी है, बल्कि अन्य कमांड के इनपुट के रूप में आउटपुट का उपयोगls करने के लिए एक बुरा विचार है । बस pdfgrep 'pattern' *.pdfपर्याप्त है
phuclv

1

StackOverflow पर एक डुप्लिकेट प्रश्न है। वहां के लोग कठोर वैश्यावृत्ति का सुझाव देते हैं। उत्तर:

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

इसी तरह के उत्तर का लाभ यहाँ --with-filenamegrep के लिए झंडा है। यह pdfgrep से कुछ हद तक बेहतर है, क्योंकि मानक grep में अधिक सुविधाएँ हैं।

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files


मुझे लगता है कि जिस उत्तर का आप उल्लेख कर रहे हैं, उसी उत्तर में टिप्पणी (या संपादन) के रूप में इसे छोड़ना बेहतर होता।
बर्नहार्ड

0

वर्तमान निर्देशिका में खोज पीडीएफ के लिए एक त्वरित स्क्रिप्ट इस प्रकार है:

#!/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ज्यादातर द्विआधारी प्रारूप है।

निर्देशिका में:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {}  - | grep "keyword"

या निर्देशिका और उसके उपनिर्देशिका में:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {}  - | grep "keyword"

इसके अलावा, क्योंकि कुछ pdfस्कैन हैं, उन्हें पहले ओसीआर किया जाना चाहिए। मैंने सभी pdfs की खोज करने के लिए एक बहुत ही सरल तरीका लिखा है जो grepउन्हें संपादित नहीं कर सकता है और उन्हें OCR कर सकता है।

मैंने देखा कि अगर किसी pdfफाइल में कोई फॉन्ट नहीं है तो यह आमतौर पर खोजे जाने योग्य नहीं है। इसलिए इसे जानकर हम इसका उपयोग कर सकते हैं pdffonts

pdffontsतालिका शीर्ष लेख की पहली 2 पंक्तियाँ होती हैं, इसलिए जब किसी फ़ाइल का पता लगाना संभव हो तो दो से अधिक पंक्ति आउटपुट होता है, यह जानकर हम बना सकते हैं:

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

फिर निर्देशिका में सभी गैर-खोज योग्य पीडीएफ़ सूची दें:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}

या निर्देशिका और उसके उपनिर्देशिका में:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}

0

यदि आप बस पीडीएफ़ नाम / प्रॉपर्टीज़ की खोज करना चाहते हैं ... या सरल स्ट्रिंग्स जो संकुचित या एन्कोडेड नहीं हैं, तो इसके बजाय 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

अगर आप सूक्ति का उपयोग कर रहे हैं तो gpdf हो सकता है! इस मामले में जाँच करें कि आप Gnome का उपयोग नहीं कर रहे हैं। इसे CLI PDF दर्शकों की एक सूची मिली है। फिर आप grepकुछ पैटर्न खोजने के लिए उपयोग कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.