วิธีค้นหาเนื้อหาของไฟล์ PDF หลายไฟล์?


226

ฉันจะค้นหาเนื้อหาของไฟล์ PDF ในไดเรกทอรี / ไดเรกทอรีย่อยได้อย่างไร ฉันกำลังมองหาเครื่องมือบรรทัดคำสั่ง ดูเหมือนว่าgrepไม่สามารถค้นหาไฟล์ PDF


5
Grep จะไม่ทำงานเนื่องจาก PDF เป็นรูปแบบไบนารีและข้อความมักถูกบีบอัดหรือเข้ารหัสในหลากหลายวิธี
ทำเครื่องหมายสตีเฟ

4
นี่คือโซลูชัน GUI: Adobe Reader ดูwikispaces.psu.edu/display/training/…
Martin Thoma

3
ที่เกี่ยวข้อง: unix.stackexchange.com/questions/6704/grep-pdf-files
Flow

3
Adobe Reader ทำงานได้ดี แต่ไม่ได้จัดทำดัชนี ดังนั้นหากคุณมีไฟล์จำนวนมากมันจะช้า โซลูชันการจัดทำดัชนีใด ๆ
Ruby

คำตอบ:


211

การแจกจ่ายของคุณควรมีโปรแกรมอรรถประโยชน์ที่เรียกว่าpdftotext:

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

"-" จำเป็นต้องมีเอาต์พุต pdftotext เป็น stdout ไม่ใช่ไฟล์ --with-filenameและ--label=ตัวเลือกที่จะใส่ชื่อแฟ้มในการส่งออกของ grep การ--colorตั้งค่าสถานะเสริมดีและบอก grep ให้ออกโดยใช้สีในอาคาร

(ใน Ubuntu pdftotextให้บริการโดยแพ็คเกจxpdf-utilsหรือpoppler-utils)

วิธีนี้ใช้pdftotextและgrepมีความได้เปรียบมากกว่าpdfgrepหากคุณต้องการใช้คุณสมบัติของ GNU grepที่pdfgrepไม่รองรับ หมายเหตุ : pdfgrep-1.3.x รองรับ-Cตัวเลือกสำหรับการพิมพ์บรรทัดบริบท


1
@Kurt Pfeifle การแก้ไข "(แก้ไขโดย -kp-)" ที่คุณทำไม่ทำงานเนื่องจากgrepกรองชื่อไฟล์ที่พิมพ์
Raphael Ahrens

@sjr ไม่ในขณะที่pdfgrepวิธีแก้ปัญหาเป็นสิ่งที่ดีสำหรับการค้นหาที่ง่ายและรวดเร็วบ่อยครั้งฉันต้องการได้รับบริบทเนื่องจากบรรทัดเดียวจะไม่มีประโยชน์พอ - ดังนั้นเมื่อฉันเพิ่มคำตอบนี้: ตัวอย่างเช่นคุณสามารถเพิ่ม ตัวเลือก -C5 ก่อน "รูปแบบของคุณ" เพื่อรวมบริบท 5 บรรทัดไปยังเอาต์พุต - pdfgrep ไม่รองรับสิ่งนี้
Colin D Bennett

โอ้มันเจ๋งดีใจที่รู้ว่ามีข้อได้เปรียบนี้แม้ว่าจะไม่ค่อยชัดเจนสำหรับคนส่วนใหญ่ที่กำลังทำอยู่
sjr

2
@sjr สำหรับบันทึก: ฉันใช้ Ubuntu 12.10 และpdfgrepไม่มีประโยชน์มันรายงานขยะจำนวนมหาศาลในไฟล์ที่ไม่สามารถจัดการได้ ในทางกลับกันโซลูชันของคุณก็ช่วยได้ ดังนั้นโปรดอย่าลบมันแม้จะผ่านไป 3 ปีก็ยังมีประโยชน์!
Ali

ฉันสามารถใช้มันใน cygwin, altough เพื่อทำให้ฟังก์ชั่นที่มีพารามิเตอร์ฉันต้องทำให้ "your_pattern" กลายเป็น '$ 1'
Koshmaar

214

มีpdfgrepซึ่งทำตามชื่อของมัน

pdfgrep -R 'a pattern to search recursively from path' /some/path

ฉันใช้มันเพื่อการค้นหาง่าย ๆ และใช้งานได้ดี

(มีแพ็คเกจใน Debian, Ubuntu และ Fedora)

ตั้งแต่เวอร์ชั่น 1.3.0 pdfgrepรองรับการค้นหาแบบเรียกซ้ำ รุ่นนี้มีใน Ubuntu ตั้งแต่ Ubuntu 12.10 (Quantal)


1
ตั้งแต่ Natty (Ubuntu 11.04) ขึ้นไป (ดูpackages.ubuntu.com/ )
Martin Thoma

2
@pavon pdfgrepมีตัวเลือกการเรียกซ้ำอีกครั้งซึ่งรวมถึง-Rการติดตาม symlinks ด้วย
Tobias Kienzler

30

Recollเป็นแอพพลิเคชั่นค้นหาข้อความ GUI แบบเต็มรูปแบบที่ยอดเยี่ยมสำหรับ Unix / Linux ที่รองรับรูปแบบที่หลากหลายรวมถึง PDF มันยังสามารถส่งหมายเลขหน้าและคำค้นหาของแบบสอบถามไปยังโปรแกรมดูเอกสารได้อย่างแม่นยำและทำให้คุณสามารถข้ามไปยังผลลัพธ์ได้ทันทีจาก GUI

Recoll ยังมาพร้อมกับอินเตอร์เฟซบรรทัดคำสั่งที่ทำงานและอินเตอร์เฟซเว็บเบราว์เซอร์


1
@ Glutanimate มันจะช่วย (ฉันและคนอื่น ๆ ด้วย) หากคุณสามารถเพิ่มตัวอย่างที่เกี่ยวข้องกับคำถามเดิม(เครื่องมือบรรทัดคำสั่งสำหรับการค้นหาไฟล์ PDF หลาย ๆ รายการ):ฉันต้องการดูวิธีค้นหาตัวแทนและวิธีการค้นหาไดเรกทอรีปัจจุบันรวมทั้งไดเรกทอรีย่อยทั้งหมด มันจะมีลักษณะอย่างไรrecoll / xapianในบรรทัดคำสั่ง (ไม่ใช่ GUI) ขอบคุณ!
บ๊องเกี่ยวกับ natty

@ LeszekŻarnaบางทีคุณสามารถโพสต์ตัวอย่างที่คุณทดสอบ?
บ๊องเกี่ยวกับ natty

recoll คู่มือผู้ใช้อาจมีคำแนะนำบางส่วน แต่ข้อเสนอทางเทคนิคมากกว่าและ "ปิดหัวข้อ" อ่านแล้ว ...
บ๊องเกี่ยวสะอาดสะอ้าน

1
@ nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow กิน backticks รอบ pwd
medoc

13

เวอร์ชันจริงของฉันใน pdfgrep (1.3.0) อนุญาตดังต่อไปนี้:

pdfgrep -HiR 'pattern' /path

เมื่อทำpdfgrep --help:

  • H: พิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง
  • i: ละเว้นความแตกต่างของขนาดตัวพิมพ์
  • R: ค้นหาไดเรกทอรีซ้ำ ๆ

มันทำงานได้ดีบน Ubuntu ของฉัน


7

ฉันสร้างสคริปต์ตัวเล็กนี้ที่ทำลายล้างได้ ขอให้สนุกกับมัน

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}

2
+1 แต่แทนที่จะเป็นคุณควรลงในท่อ$filename. grep
Raphael Ahrens

3

ฉันชอบคำตอบของ @ sjr แต่ฉันชอบ xargs vs -exec ฉันพบว่า xargs อเนกประสงค์มากขึ้น เช่นกับ -P เราสามารถใช้ประโยชน์จากหลาย ๆ ซีพียูเมื่อมันสมเหตุสมผล

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"

จุดที่น่าสนใจเกี่ยวกับxargsความสามารถในการประมวลผลแบบขนาน โปรดทราบว่าคุณ--labelมีตัวเลือกอาร์กิวเมนต์จะแท้จริง {}เพราะgrepคำสั่งดำเนินการอยู่ในขณะนี้ไม่ได้อยู่ในบริบทของ'sfind exec
mklement0

2

ฉันมีปัญหาเดียวกันดังนั้นฉันจึงเขียนสคริปต์ซึ่งค้นหาไฟล์ pdf ทั้งหมดในโฟลเดอร์ที่ระบุเพื่อหาสตริงและพิมพ์ไฟล์ PDF ที่ตรงกับสตริงการสืบค้น

บางทีนี่อาจจะเป็นประโยชน์กับคุณ

คุณสามารถดาวน์โหลดได้ ที่นี่


อาจมีประโยชน์ในการใส่สคริปต์ในความคิดเห็นหรือไม่
baxx

ฉันลองใช้สคริปต์ของคุณแล้วมันก็ช้ากว่าpdfgrepโซลูชันหรือซับไลน์ของ sjr มากและทำให้ฉันใช้กระบวนการต่อเนื่องโดยใช้เธรด CPU 100% แม้ว่าฉันจะกด Ctrl-C เพื่อยุติการทำงานก็ตาม
เจสัน

2

หากคุณต้องการดูชื่อไฟล์ด้วยpdftotext ให้ใช้คำสั่งต่อไปนี้:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 

2

มียูทิลิตี้อื่นที่เรียกว่าเป็นripgrep ทั้งหมดซึ่งจะขึ้นอยู่กับripgrep

มันสามารถจัดการได้มากกว่าเพียงแค่เอกสาร PDF เช่นเอกสาร Office และภาพยนตร์และผู้เขียนเรียกร้องpdfgrepมันจะเร็วกว่า

ไวยากรณ์คำสั่งสำหรับการค้นหาไดเรกทอรีปัจจุบันซ้ำ ๆ และหนึ่งวินาที จำกัด เฉพาะไฟล์ PDF เท่านั้น:

rga 'pattern' .
rga --type pdf 'pattern' .

1

มีเครื่องมือ grep เครื่องมือเปิดแหล่งข้อมูลทั่วไปcrgrepซึ่งค้นหาภายในไฟล์ PDF แต่ยังมีทรัพยากรอื่น ๆ เช่นเนื้อหาที่ซ้อนอยู่ในที่เก็บถาวรตารางฐานข้อมูลเมตาดาต้ารูปภาพการพึ่งพาไฟล์ POM และทรัพยากรเว็บ - และการรวมกันของเหล่านี้รวมถึงการค้นหาแบบเรียกซ้ำ

คำอธิบายแบบเต็มภายใต้แท็บไฟล์จะครอบคลุมสิ่งที่เครื่องมือสนับสนุน

ฉันพัฒนา crgrep เป็นเครื่องมือ opensource


เครก - คุณมีส่วนเกี่ยวข้องกับโครงการนั้นหรือไม่? ถ้าเป็นเช่นนั้นคุณควรระบุไว้ในคำตอบของคุณ ผมพูดแบบนี้เพราะคุณได้โพสต์เพียงคำตอบที่เหมือนจริงสองคำถามเก่าอื่น ๆ ...
สตีเฟ่นซี

อัปเดตโพสต์เพื่อชี้แจงว่าฉันเป็นผู้เขียน crgrep
Craig

1

ขั้นแรกให้แปลงไฟล์ pdf ทั้งหมดของคุณเป็นไฟล์ข้อความ:

for file in *.pdf;do pdftotext "$file"; done

จากนั้นใช้grepตามปกติ นี่เป็นสิ่งที่ดีโดยเฉพาะอย่างยิ่งเมื่อคุณมีหลายแบบสอบถามและไฟล์ PDF จำนวนมาก


สิ่งนี้เมื่อทำร่วมกับ ag github.com/ggreer/the_silver_searcher สามารถแยกวิเคราะห์ได้ที่ psychedeliks Gb โดย microseconds ไฟล์แฟลตเพื่อชีวิต
NVRM

0

คุณต้องใช้เครื่องมือบางอย่างเช่น pdf2text เพื่อแปลงไฟล์ pdf เป็นไฟล์ข้อความก่อนแล้วจึงค้นหาข้อความ (คุณอาจพลาดข้อมูลหรือสัญลักษณ์บางอย่าง)

หากคุณใช้ภาษาการเขียนโปรแกรมอาจมีไลบรารี PDF ที่เขียนขึ้นเพื่อจุดประสงค์นี้ เช่นhttp://search.cpan.org/dist/CAM-PDF/สำหรับ Perl


0

ลองใช้ 'acroread' ในสคริปต์อย่างง่ายเหมือนกับที่กล่าวมาข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.