क्या उबंटू में पहले पाठ में कनवर्ट किए बिना, grep की शक्ति का उपयोग करके पीडीएफ फाइलों को खोजने का एक तरीका है?
क्या उबंटू में पहले पाठ में कनवर्ट किए बिना, grep की शक्ति का उपयोग करके पीडीएफ फाइलों को खोजने का एक तरीका है?
जवाबों:
पैकेज स्थापित करें pdfgrep
, फिर कमांड का उपयोग करें:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
------
सबसे सरल तरीका है
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
एक पुनरावर्ती ध्वज भी है। तो इस उत्तर को शायद कम किया जा सकता है pdfgrep -R pattern /path/
:। हालांकि यह कम प्रभावी हो सकता है अगर यह हर फाइल के माध्यम से जाता है, भले ही यह पीडीएफ न हो। और मुझे लगता है कि यह å, ä और ö जैसे अंतरराष्ट्रीय पात्रों के साथ मुद्दे हैं।
-n
विकल्प pdfgrep के लिए एक समर्थक है क्योंकि यह आउटपुट में पृष्ठ संख्या को शामिल करने की अनुमति देता है (आगे की प्रक्रिया के लिए सहायक हो सकता है)।
pattern
? क्या है {}
? `+ 'के साथ क्या हो रहा है? मुझे पहले पढ़ने पर कोई विचार नहीं है ... इसलिए मैं जिस मैनपेज पर जाता हूं, वह मुझे लगता है।
यदि आपने poppler-utils
(उबंटू डेस्कटॉप पर डिफ़ॉल्ट) स्थापित किया है, तो आप इसे "कन्वर्ट" मक्खी पर कर सकते हैं और इसे इसमें डाल सकते हैं grep
:
pdftotext my.pdf - | grep 'pattern'
यह एक .txt फ़ाइल नहीं बनाएगा।
pdftotext
यह फ़ाइल नाम है जिसे इसे लिखना चाहिए। हालाँकि, कन्वेंशन द्वारा, टूल आमतौर पर आपको stdout
फ़ाइल के बजाय लिखने के बजाय लिखने की अनुमति देते हैं -
। इसी तरह, कुछ उपकरण stdout
डिफ़ॉल्ट रूप से लिखते हैं यदि आप इस तरह के तर्क को पूरी तरह से छोड़ देते हैं (लेकिन यह हमेशा अस्पष्टता पैदा किए बिना संभव नहीं है)।
pdfgrep को इस उद्देश्य के लिए लिखा गया था और यह उबंटू में उपलब्ध है।
यह ज्यादातर संगत होने की कोशिश करता है grep
और इस तरह "grep की शक्ति" प्रदान करता है, केवल PDF के लिए विशेष। जिसमें सामान्य grep विकल्प शामिल हैं, जैसे कि --recursive
, --ignore-case
या --color
।
इसके विपरीत pdftotext | grep
, pdfgrep एक मैच के पेज नंबर को एक शानदार तरीके से आउटपुट कर सकता है और आम तौर पर तेजी से होता है जब इसे पूरे दस्तावेज़ (जैसे --max-count
या --quiet
) को खोजना नहीं पड़ता है ।
मूल उपयोग है:
pdfgrep PATTERN FILE..
PATTERN
आपकी खोज स्ट्रिंग और FILE
फ़ाइल नाम (या शेल में वाइल्डकार्ड) की सूची कहां है ।
अधिक जानकारी के लिए मैनपेज देखें ।
नहीं।
एक पीडीएफ में डेटा का एक हिस्सा होता है, उनमें से कुछ पाठ, उनमें से कुछ चित्र और उनमें से कुछ वास्तव में जादुई फैंसी XY (जैसे .u3d फाइलें) होते हैं। वे हिस्सा अधिकतर संकुचित होते हैं (उदाहरण के लिए, सपाट, जाँच http://www.verypdf.com/pdfinfoeditor/compression.htm )। 'ग्रेप' एक .pdf के लिए आपके पास है संपीड़न उर्फ रिवर्स पाठ निकालने के लिए।
आप है कि या तो प्रति उपकरणों के साथ फ़ाइल जैसे कर सकते हैं pdf2text
आप एक 'इंडेक्सर' (देखो चलाने के लिए और परिणाम grep, या xapian.org या Lucene ) जो अपने .pdf फ़ाइल के बाहर एक खोज करने योग्य अनुक्रमणिका बनाता है और फिर आप खोज का उपयोग कर सकते pdf के कंटेंट को प्राप्त करने के लिए उस इंडेक्सर के इंजन टूल।
लेकिन नहीं, आप grep
पीडीएफ फाइलों को पहले टेक्स्ट को निकाले बिना विश्वसनीय उत्तर की उम्मीद नहीं कर सकते ।
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
लाइनों को प्रिंट करने के लिए पैटर्न पीडीएफ के अंदर होता है
cd आपके फ़ोल्डर में आपकी पीडीएफ-फाइल और फिर ।।
pdfgrep 'pattern' your.pdf
या यदि आप केवल एक से अधिक पीडीएफ-फाइल में खोज करना चाहते हैं (जैसे आपके फ़ोल्डर में सभी पीडीएफ-फाइलों में)
pdfgrep 'pattern' `ls *.pdf`
या
pdfgrep 'pattern' $(ls *.pdf)
ls
करने के लिए एक बुरा विचार है । बस pdfgrep 'pattern' *.pdf
पर्याप्त है
StackOverflow पर एक डुप्लिकेट प्रश्न है। वहां के लोग कठोर वैश्यावृत्ति का सुझाव देते हैं। उत्तर:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
इसी तरह के उत्तर का लाभ यहाँ --with-filename
grep के लिए झंडा है। यह pdfgrep से कुछ हद तक बेहतर है, क्योंकि मानक grep में अधिक सुविधाएँ हैं।
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
वर्तमान निर्देशिका में खोज पीडीएफ के लिए एक त्वरित स्क्रिप्ट इस प्रकार है:
#!/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 \;
मुझे लगता है कि आप इसका मतलब है कि 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 {}
यदि आप बस पीडीएफ़ नाम / प्रॉपर्टीज़ की खोज करना चाहते हैं ... या सरल स्ट्रिंग्स जो संकुचित या एन्कोडेड नहीं हैं, तो इसके बजाय 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