วิธีค้นหา PDF ที่ไม่สามารถค้นหาได้โดยอัตโนมัติ


4

สมมติว่าฉันมีไดเรกทอรีที่เต็มไปด้วย PDF จำนวนมาก ในส่วนใหญ่ข้อความสามารถค้นหาได้อย่างสมบูรณ์ซึ่งเป็นวิธีที่ฉันต้องการ แต่บางคนก็เป็นเพียงการสแกนภาพและพวกเขาต้องเป็น OCR-ed

ถ้าอย่างนั้นการทำ OCR แบบแบตช์ในไดเรคทอรีทั้งหมดมีวิธีที่จะระบุว่า PDF ใดเป็นไฟล์ภาพอย่างเดียวที่ต้องเป็น OCR-ed หรือไม่?

ฉันไม่ใช่โปรแกรมเมอร์ แต่ต้องการโซลูชันที่เป็นมิตรกับ linux

คำตอบ:


3

ฉันไม่แน่ใจว่านี่เป็นวิธีแก้ปัญหา 100% หรือไม่ แต่ฉันมาพร้อมกับสคริปต์ต่อไปนี้ซึ่งจะช่วยให้คุณได้รับส่วนที่ดีถ้าไม่ใช่วิธีทั้งหมด (ฉันยังไม่ผ่านสเป็ค) มันควรจะเรียกใช้จาก ไดเรกทอรีที่มี PDF ทั้งหมด (มันจะค้นหาไดเรกทอรีย่อย)

#! /bin/bash

if [[ ! "$#" = "1" ]]
  then
      echo "Usage: $0 /path/to/PDFDirectory"
      exit 1
fi

PDFDIRECTORY="$1"

while IFS= read -r -d $'\0' FILE; do
    PDFFONTS_OUT="$(pdffonts "$FILE" 2>/dev/null)"
    RET_PDFFONTS="$?"
    FONTS="$(( $(echo "$PDFFONTS_OUT" | wc -l) - 2 ))"
    if [[ ! "$RET_PDFFONTS" = "0" ]]
      then
          READ_ERROR=1
          echo "Error while reading $FILE. Skipping..."
          continue
    fi
    if [[ "$FONTS" = "0" ]]
      then
          echo "NOT SEARCHABLE: $FILE"
      else
          echo "SEARCHABLE: $FILE"
    fi
done < <(find "$PDFDIRECTORY" -type f -name '*.pdf' -print0)

echo "Done."
if [[ "$READ_ERROR" = "1" ]]
  then
      echo "There were some errors."
fi

ใช้งานได้โดยค้นหาจำนวนแบบอักษรที่ระบุในแต่ละ PDF หากไฟล์ไม่มีแบบอักษรใด ๆ ไฟล์นั้นจะถือว่ามีเฉพาะภาพเท่านั้น (นี่อาจเป็นไฟล์ที่มีการป้องกันด้วยรหัสผ่านฉันไม่มีความคิดไม่มีอะไรที่จะทดสอบ) หากมีบางสิ่งที่สามารถค้นหาได้และบางอย่างซึ่งเป็นรูปภาพสิ่งนี้จะไม่ทำงาน - แต่อาจเป็นประโยชน์ในการแยกเอกสารรูปภาพที่สแกนในคอนเทนเนอร์ PDF จาก PDF ของ "ของจริง"

แน่นอนว่าคุณสามารถแสดงความคิดเห็นในส่วนของ if-then-else loop ซึ่งไม่ได้ใช้หากคุณต้องการพิมพ์ไฟล์ที่ไม่สามารถค้นหาได้เท่านั้น


ดูมีแนวโน้ม! แต่เมื่อฉันเรียกใช้สคริปต์นี้ฉันคิดว่าฉันได้รับข้อผิดพลาด มันบอกว่า: find: paths must precede expression: Anker2001.pdf Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] "Anker2001.pdf" เป็นไฟล์ตัวที่สองในไดเรกทอรี
Brian Z

ฉันได้ทำการเปลี่ยนแปลงบางอย่างกับสคริปต์ซึ่งอาจแก้ไขปัญหาของคุณตอนนี้คุณเรียกใช้และส่งผ่านไดเรกทอรีที่คุณต้องการตรวจสอบเป็นอาร์กิวเมนต์ ฉันยังแก้ไขข้อผิดพลาดใหญ่ในการตรวจสอบโดยการลบ "." หลังจาก $ FONTSFOUND !!!
davidgo

ดูเหมือนว่าจะแปลก แต่ก็หยุดทำงาน ความคิดใดว่าทำไมจะเป็นอย่างไร
Brian Z

ไม่มีอะไรเลย - ฉันจำเป็นต้องรู้เพิ่มเติมเกี่ยวกับวิธีการ / เมื่อมันหยุดทำงานข้อผิดพลาดหรือสิ่งที่มีคุณ ฉันสงสัยว่าคุณมีไฟล์ PDF ที่มีช่องว่างหรือไม่และถ้ามีบางอย่างเช่นนั้นโยนสคริปต์ (ไม่ใช่วิธีการแก้ปัญหา แต่การลดทอนอาจเป็นการเพิ่มบรรทัดเพื่อย้ายไฟล์ที่ถูกตรวจสอบออกจากเส้นทางของสคริปต์จากนั้นรันใหม่อีกครั้งดูตำแหน่งที่ติด ฯลฯ - แล้วย้ายไฟล์กลับมา)
davidgo

ฉันได้รับข้อผิดพลาดเดียวกับที่โพสต์ในความคิดเห็นดั้งเดิม วิธีเดียวที่ฉันจะทำให้มันทำงานได้ตอนนี้คือถ้ามีไฟล์ PDF เพียงไฟล์เดียวในโฟลเดอร์ ฉันพยายามต่อไปกับไฟล์ต่าง ๆ ชื่อไฟล์ธรรมดาที่ไม่มีช่องว่าง ฯลฯ แต่ไม่มีอะไรทำงาน
Brian Z

2

ฉันจะใช้เคล็ดลับมันเป็นข้อเท็จจริงรองที่แปลกประหลาดฉันสังเกตว่าpdfไฟล์ไม่มีตัวอักษรใด ๆ มันมักจะไม่สามารถค้นหาได้ pdffontsดังนั้นการรู้นี้เราสามารถใช้

2 บรรทัดแรกของpdffontsส่วนหัวเป็นส่วนหัวของตารางดังนั้นเมื่อไฟล์ที่ค้นหาได้มีเอาต์พุตมากกว่าสองบรรทัดโดยรู้ว่าเราสามารถสร้างสิ่งนี้ได้:

gedit check_pdf_searchable.sh

จากนั้นวางสิ่งนี้

#!/bin/bash 
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1" # alternatively you can use ocrmypdf "$1" "${1}_ocr.pdf"
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

ฉันมีปัญหากับtreeวิธีการแก้ปัญหานี้ได้ผลสำหรับฉันโดยใช้สคริปต์เดียวกัน

find . -name "*.pdf" -type f -exec ~/check_pdf_searchable.sh {} \;

~/สมมติว่าสคริปต์อยู่ในไดเรกทอรีบ้านของคุณ ทำให้สิ่งต่าง ๆ ง่ายขึ้น


ระบุว่า (1)  check_pdf_searchable.shมาจากคำตอบของ Eduard Florinescu (2) คำตอบของ Eduard คือการเขียนคำตอบของ davidgo (เพิ่มเติมจากpypdfocrคำสั่ง) และ (3) คำตอบของ davidgo ใช้ไปแล้วfindดูเหมือนว่าฉันว่าคำตอบนี้ไม่ได้ทำลาย พื้นใหม่ ๆ
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.