ฉันจะแปลงไฟล์ pdf จากระดับสีเทาเป็นขาวดำได้อย่างไร


11

ระบบปฏิบัติการของฉันคือ Ubuntu 12.04 ฉันจะแปลงไฟล์ pdf จากระดับสีเทาเป็นขาวดำได้อย่างไร ไฟล์ pdf ระดับสีเทามาจากการสแกนด้วยตัวเลือกระดับสีเทาและ OCR เป็นไฟล์ PDF ที่ต้องใช้ขนาดขาวดำ


ปรับปรุง:

ต่อไปนี้การตอบกลับของมาร์โก, BW ไฟล์ PDFไม่ดีและไฟล์ต้นฉบับเป็นที่นี่


ลองscantailor
frostschutz

scantailorมีคุณสมบัติที่มีประโยชน์มากมายเมื่อพูดถึงการเตรียมการสแกนสำหรับ OCR และนั่นเป็นเหตุผลเดียวที่ฉันแนะนำ (เป็นความคิดเห็นไม่ใช่คำตอบ)
frostschutz

คุณสามารถเปิดและส่งออก (อย่างน้อยบางส่วน) .pdf เป็น libreoffice (และด้วยเหตุนี้ฉันจะเดาตัวประมวลผลคำที่ทันสมัยที่สุด) ไม่ทราบว่าจะทำให้การเปลี่ยนแปลงที่คุณต้องการเป็นไปได้หรือง่าย ๆ
goldilocks

1
นอกจากนี้ยังมีpdfimages(poppler) เพื่อแยกภาพที่สแกนออกจากคอนเทนเนอร์ PDF อาจมีประสิทธิภาพมากกว่าในการจัดการกับ ImageMagick ตั้งแต่แรก
frostschutz

คำตอบ:


9

1) ใช้ghostscriptเพื่อแปลง PDF เป็นไฟล์ PostScript ขาวดำโดยใช้อุปกรณ์psmono :

gs -q -sDEVICE=psmono -o mono.ps input.pdf

2) จากนั้นแปลง PostScript ขาวดำกลับเป็น PDF:

ps2pdf mono.ps

แก้ไข:psmonoอุปกรณ์สร้าง 1 บิตภาพครึ่งเสียงซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการ ฉันหาวิธีระบุขีด จำกัด โดยใช้ ghostscript ไม่ได้ดังนั้นฉันจึงเลือกใช้ imagemagick convertภายในใช้ ghostscript เพื่อแปลง PDF จากนั้นจะใช้การกรองเกณฑ์ในการสร้างภาพ 1 บิตและใช้ ghostscript อีกครั้งเพื่อสร้าง PDF เนื่องจากconvertใช้ความละเอียด 75DPI โดยค่าเริ่มต้นซึ่งอาจไม่ตรงกับความละเอียดที่แท้จริงของคุณคุณสามารถระบุdensityอาร์กิวเมนต์ได้ และทดสอบด้วยการthresholdตั้งค่า ค่าที่เหมาะสมที่สุดนั้นขึ้นอยู่กับไฟล์อินพุต

convert -density 150 -threshold 50% input.pdf output.pdf

ขอบคุณ! ปัญหาหนึ่งในการรันคำสั่งแรก: pdf ระดับสีเทาดั้งเดิมอยู่ที่ประมาณ 25MB และการรันยังไม่เสร็จหลังจาก 15 นาทีและไฟล์เอาต์พุต mono.ps มีขนาด 150MB และยังคงเพิ่มขึ้น ฉันกังวลเกี่ยวกับเรื่องนั้น มีวิธีอื่นเช่นพิมพ์ไปยังไฟล์ pdf ของ BW หรือไม่
ทิม

@Tim นั่นไม่ใช่เรื่องแปลก ไฟล์ PostScript จะไม่ถูกบีบอัดไฟล์ PDF ที่ได้จะมีขนาดเล็กลง
Marco

ขอบคุณ ใช้เวลาประมาณ 20 นาที ไฟล์ pdfไม่ดี และไฟล์ต้นฉบับอยู่ที่นี่
ทิม

@ เวลาคุณภาพแย่มากไม่เหมาะกับ OCR ไม่ว่าคุณจะทำอะไรก็ตาม
frostschutz

4

วิธีที่ดีที่สุดที่ฉันค้นพบที่นั่นโดยไม่สูญเสียคุณภาพลบเงาเสียงข้อความจากหน้าถัดไปมีเลือดออกผ่าน ฯลฯ :

1) แปลงไฟล์ PDF เป็นภาพเดี่ยวก่อน

pdfimages combined_ocr.pdf page

2) สองเอาเงาเสียงข้อความจากหน้าถัดไปมีเลือดออกผ่าน (เครดิตไปยังบล็อกนี้ )

ls ./p*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg

สิ่งนี้สามารถเพิ่มเป็นขั้นตอนพิเศษหรือแทนคำสั่งด้านบนเพื่อรับสองสีเท่านั้น:

ls ./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg

3) ใช้เพื่อสร้างไฟล์ pdf จากภาพ jpg ทุกภาพโดยไม่สูญเสียความละเอียดหรือคุณภาพ:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

4) สิ่งนี้เชื่อมต่อ pdfpages เข้าด้วยกัน:

pdftk *.pdf cat output combined.pdf

5) และสุดท้ายฉันเพิ่มเลเยอร์ข้อความ OCRed ที่ไม่เปลี่ยนคุณภาพของการสแกนในไฟล์ PDF เพื่อให้สามารถค้นหาได้:

pypdfocr combined.pdf 

3

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

ฉันต้องการไฟล์ PDF bw ที่มีคุณภาพของภาพที่ดีและขนาดไฟล์เล็ก โซลูชันของฉันใช้gsเพื่อแยกไฟล์ bmp สีเทาจาก pdf convertเพื่อกำหนด bmps เหล่านั้นเป็น bw และบันทึกเป็นไฟล์ TIFF จากนั้นimg2pdfเพื่อบีบอัดภาพ TIFF และรวมเป็นไฟล์ PDF เดียว

ฉันพยายามไปที่ tiff โดยตรงจาก pdf แต่คุณภาพไม่เหมือนกันดังนั้นฉันจึงบันทึกแต่ละหน้าเป็น bmp สำหรับไฟล์ pdf หนึ่งหน้าconvertทำได้ดีมากจาก bmp เป็น pdf ตัวอย่าง:

gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
   -sOutputFile=./pdf_image.bmp ./input.pdf

convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf

สำหรับหลาย ๆ หน้าgsสามารถรวมไฟล์ PDF หลาย ๆ ไฟล์ไว้ในที่เดียว แต่img2pdfให้ขนาดไฟล์ที่เล็กกว่า gs ไฟล์ TIFF ต้องไม่ถูกบีบอัดเป็นอินพุตให้กับ img2pdf โปรดทราบว่าหน้าเว็บจำนวนมากไฟล์ bmp และ tiff ระดับกลางมักจะมีขนาดใหญ่ pdftkหรือjoinpdfจะดีกว่าถ้าพวกเขาสามารถผสานไฟล์ PDF convertบีบอัดจาก

ฉันคิดว่ามันมีทางออกที่ดีกว่า อย่างไรก็ตามวิธีการของฉันให้ผลลัพธ์ที่มีคุณภาพของภาพที่ดีมากและขนาดไฟล์เล็กลงมาก หากต้องการรับข้อความกลับใน bw pdf ให้เรียกใช้ OCR อีกครั้ง

เชลล์สคริปต์ของฉันใช้ gs, แปลงและ img2pdf เปลี่ยนพารามิเตอร์ (# ของหน้าเว็บสแกน dpi เกณฑ์% ฯลฯ ) ของ บริษัท chmod +x ./pdf2bw.shจดทะเบียนในการเริ่มต้นตามความจำเป็นและการทำงาน นี่คือสคริปต์แบบเต็ม (pdf2bw.sh):

#!/bin/bash

num_pages=12
dpi_res=300
input_pdf_name=color_or_grayscale.pdf
bw_threshold=40%
output_pdf_name=out_bw.pdf
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done

2

ที่จริงแล้วถ้ามันมาจากการสแกนวิธีเดียวที่สมเหตุสมผลคือการใช้ pdfimages และแปลงกราฟิกพื้นฐาน ฉันใช้สคริปต์นี้เพื่อแปลง:

#!/bin/sh
if [ -z "$1" -o -z "$2" ]; then
    echo "Syntax: $0 <input.pdf> <output.pdf>"
    exit 1
fi

pdfimages "$1" scan
for a in scan*.ppm; do 
   convert -white-threshold 85% -monochrome $a `basename $a .ppm`.tiff
done
tiffcp scan*.tiff output.tiff
tiff2pdf output.tiff -o "$2" -p A4 -F
rm scan*.ppm scan*.tiff output.tiff

2

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

สคริปต์จะล้มเหลว img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files เนื่องจาก--dpiไม่มีอาร์กิวเมนต์ที่ยอมรับสำหรับ img2pdf แล้ว แต่จะได้รับการแก้ไขจากไฟล์อินพุตดังนั้นคุณจึงสามารถละทิ้งมันได้

นี่คือเวอร์ชั่นสคริปต์ของฉัน ฉันไม่ต้องการแก้ไขสคริปต์สำหรับทุกไฟล์ดังนั้นฉันผ่านจำนวนหน้าและชื่อไฟล์อินพุตเมื่อฉันเรียกใช้ ฉันมีชุดชื่อออกไปและการตั้งค่าความละเอียด 200 dpi ซึ่งทำงานสำหรับขั้นตอนการทำงานของฉัน แต่คุณอาจต้องการที่จะเปลี่ยนมันหรือเปิดให้เป็นและและผ่านพวกเขาใน00input_name$3$4

เมื่อต้องการเรียกใช้เช่น./pdf2bw.sh <number_of_pages> <input_name>./pdf2bw.sh 55 input.pdf

#!/bin/bash

num_pages=$1
input_pdf_name=$2
output_pdf_name="00$2"
bw_threshold=40%
dpi_res=200
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done

คุณควรอ้างอิงตัวแปรเชลล์ของคุณ โดยเฉพาะอย่างยิ่งคนที่มาจากการขัดแย้งหรือการป้อนข้อมูลของผู้ใช้อื่น ๆ เช่นและแม้กระทั่ง"./$input_pdf_name" seq 1 "$num_pages"นอกจากนี้คุณอาจต้องการที่จะเปลี่ยน`…`ไป$(…)- เห็นนี้ , นี้และนี้
G-Man พูดว่า 'Reinstate Monica'

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