วิธีแปลงไฟล์ pdf ทั้งหมดเป็นข้อความ (ภายในโฟลเดอร์) ด้วยคำสั่งเดียว?


18

ฉันรู้ว่าฉันสามารถแปลงไฟล์ pdf เป็นไฟล์ข้อความแบบหนึ่งต่อหนึ่ง:

$ pdftotext filename.pdf

แต่มีคำสั่งเดียวที่จะทำการแปลงนั้นโดยไม่ระบุชื่อไฟล์แยกต่างหากเพื่อทำการแปลงทั้งหมดหรือไม่

ฉันเห็นที่นี่ใน Wikipediaว่า "Wildcards (*) ตัวอย่างเช่น $ pdftotext * pdf สำหรับการแปลงไฟล์หลาย ๆ ไฟล์ไม่สามารถใช้เพราะ pdftotext คาดหวังเพียงชื่อไฟล์เดียว"

pdf  text  convert  batch 

คำตอบ:


23

ต่อไปนี้จะแปลงไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน:

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

เพียงหนึ่งคำสั่งของมันก็สามารถพิมพ์ในหนึ่งบรรทัดใน terminal (pdftotext ของตนภายในสำหรับวงในบรรทัดไวยากรณ์หนึ่งซึ่งเป็นสิ่งที่สหกรณ์ถาม)
แซม

ตรวจสอบการเชื่อมโยงเหล่านี้สำหรับข้อมูลเพิ่มเติมของวิธีการห่วงการทำงาน: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
แซม

สิ่งนี้จะไม่ทำให้เกิดปัญหากับไฟล์ที่ไม่ใช่ pdf หรือไม่
cprofitt

สิ่งนี้จะสร้างไฟล์เช่น "filename.pdf.txt" หรือไม่
Ryan C. Thompson

ใช่ถ้าเป็นปัญหาเราสามารถลบนามสกุล. pdf โดยใช้ 'sed' หรือ 'awk' แต่มันจะเพิ่มความซับซ้อนให้กับคำสั่ง
Sam

8
ls *.pdf | xargs -n1 pdftotext

xargsมักจะเป็นทางออกที่รวดเร็วสำหรับการเรียกใช้คำสั่งเดียวกันหลายครั้งด้วยการเปลี่ยนแปลงเพียงเล็กน้อยในแต่ละครั้ง -n1ตัวเลือกทำให้แน่ใจว่ามีเพียงหนึ่งไฟล์ PDF ที่ถูกส่งไปยัง pdftotext ในเวลา

แก้ไข: หากคุณกังวลเกี่ยวกับการเว้นวรรคในชื่อไฟล์คุณสามารถใช้ทางเลือกนี้:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext

โปรดดูคำตอบของฉัน: คำสั่งนั้นสามารถปรับเพื่อหลีกเลี่ยงปัญหาที่กล่าวถึงที่นั่น? นี่ไม่ได้หมายความว่าวิธีการแก้ปัญหาของคุณไม่ดีตรงกันข้ามมันทำสิ่งที่เฉพาะเจาะจงมาก ๆ ซึ่งทางเลือกอื่นที่นี่ไม่ได้ทำ แต่ฉันแค่อยากรู้

2
อีกทางเลือกหนึ่ง:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb

2

เขียนสคริปต์ทุบตี

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

หรือพิมพ์ในคำสั่งหนึ่งบรรทัดดังนี้:

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

ฉันหวังว่านี่จะช่วยได้. ฉันไม่มีกลุ่มไฟล์. pdf ขนาดใหญ่ที่ใช้ทดสอบนี้ แต่ฉันใช้กลยุทธ์นี้เพื่อแปลงไฟล์. flac เป็นไฟล์. ogg


มันสามารถทำได้โดยการเปิด terminal ในโฟลเดอร์นั้นและเรียกใช้คำสั่งแทนการแทรกเส้นทางด้วยตนเอง?

คุณไม่สามารถวางที่นี่เป็นอย่างนั้นและแทรกลงในคำตอบของคุณ? นั่นจะเป็นคำตอบที่ดี ฉันไม่สามารถเข้าถึงสูตรที่ดีได้เพียงแค่ลบบางส่วนของสิ่งที่คุณโพสต์

การค้นหาและ xargs ที่ฉันแนะนำในตอนแรกไม่ทำงานเมื่อฉันมีโอกาสทดสอบ
cprofitt

1

ฉันต้องขอขอบคุณแซมและRyan Thompsonและผู้ตอบคำถามอื่น ๆ ทุกคนก่อนอื่นสำหรับคำตอบของฉันที่นี่ไม่มีอะไรนอกจากความผันแปรที่เกี่ยวข้องกับความเป็นไปได้ในการเพิ่มโซลูชันของพวกเขาในการกระทำของ Thunar:

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

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

คำสั่งที่มีfind . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext(มาจากRyan Thompson ) มันเป็นสิ่งที่ฉันชอบที่จะใช้ แต่มันมีการเปิดที่น่ารังเกียจ ... ดูด้านล่าง ...

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

... มันเป็นคำสั่งตลกที่จะใช้ด้วยความระมัดระวัง: มันถูกสร้างขึ้นเพื่อแปลงข้อความเป็น pdf ทั้งหมดภายในโฟลเดอร์ที่มันถูกไล่ออกดังนั้นถ้ามันถูกไล่ออกโดยไม่ตั้งใจในโฟลเดอร์บ้านมันจะมีบางอย่างที่ไม่พึงประสงค์ ผลกระทบ: ไฟล์ PDF ทั้งหมดของคุณจะถูกแปลงเป็นข้อความ!

(ฉันทดสอบเช่นนี้: สร้างโฟลเดอร์ชื่อ "test" บนเดสก์ท็อปและในนั้นเป็นไฟล์ pdf และชุดของโฟลเดอร์ภายในโฟลเดอร์ ( /Desktop/test/a/b/c/e/f/g/h/i) แต่ละไฟล์มี pdf เดียวกันการใช้คำสั่งนั้นใน/Desktop/testนั้นได้แปลงไฟล์pdf ทั้งหมดไปเป็นใน โฟลเดอร์ "i")

(ฉันยินดีต้อนรับความคิดเห็นเกี่ยวกับวิธีการปรับคำสั่งนี้เพื่อหลีกเลี่ยงความเสี่ยงนั้น)

แทนที่ด้วยอีกอันหนึ่ง ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) ที่มาจาก แซมปัญหาจะถูกหลีกเลี่ยง

แต่ในบางกรณีเราอาจต้องการสิ่งที่ทางออกของไรอันแน่นอน!


1
คุณสามารถหลีกเลี่ยงการค้นหาคำสั่งในไดเรกทอรีย่อยโดยใช้find -maxdepth 1นอกจากนี้เมื่อใส่ลงในคุณลักษณะการดำเนินการที่กำหนดเองของ Thunar คุณควรแทนที่find .ด้วยfind %Fเพื่ออนุญาตให้ Thunar ส่งผ่านเส้นทางของไดเรกทอรีที่เลือกอย่างเหมาะสม
Ryan C. Thompson

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

หนึ่งในผลนี้sample.pdf.txt

ฉันลองใช้อันนี้ตามที่ user2357111317 แนะนำและฉันยังมี - เลย์เอาต์เพื่อรักษาเลย์เอาต์ของข้อความ

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