Bagaimana saya bisa mengkonversi file pdf dari skala abu-abu ke hitam-putih?

11

OS saya adalah Ubuntu 12.04. Bagaimana saya bisa mengkonversi file pdf dari skala abu-abu ke hitam-putih? File pdf skala abu-abu berasal dari pemindaian dengan opsi skala abu-abu, dan pdf skala hitam-putih diperlukan oleh OCR.


Memperbarui:

Mengikuti jawaban Marco, pdf BW tidak bagus dan file aslinya ada di sini .

Tim
sumber
cobascantailor
frostschutz
scantailormemiliki banyak fitur berguna lainnya dalam hal mempersiapkan pemindaian untuk OCR, dan itulah satu-satunya alasan mengapa saya menyarankannya (sebagai komentar, bukan jawaban)
frostschutz
Anda dapat membuka, dan mengekspor, (setidaknya beberapa) .pdf di libreoffice (dan karenanya saya kira kebanyakan pengolah kata modern). Tidak tahu apakah itu akan membuat perubahan yang Anda inginkan mungkin atau mudah.
goldilocks
1
Ada juga pdfimages(poppler) untuk mengekstrak gambar yang dipindai dari wadah PDF-nya. Mungkin lebih efisien untuk menanganinya dengan ImageMagick.
frostschutz
askubuntu.com/questions/9868/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功 法轮功

Jawaban:

9

1) Gunakan ghostscript untuk mengonversi PDF ke file PostScript monokrom menggunakan perangkat psmono :

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

2) Kemudian, ubah PostScript monokrom kembali ke PDF:

ps2pdf mono.ps

EDIT: The psmonoperangkat menciptakan 1-bit setengah-nada gambar yang tampaknya bukan apa yang Anda inginkan. Saya tidak dapat menemukan cara untuk menentukan ambang menggunakan ghostscript, jadi saya menggunakan imagemagick. convertinternal menggunakan ghostscript untuk mengonversi PDF. Ini kemudian menerapkan pemfilteran ambang untuk menghasilkan gambar 1-bit dan menggunakan ghostscript lagi untuk membuat PDF. Karena convertmenggunakan resolusi 75DPI secara default, yang mungkin tidak cocok dengan resolusi Anda yang sebenarnya, Anda dapat memberikan densityargumen. Dan bereksperimen dengan thresholdpengaturan. Nilai optimal sangat tergantung pada file input.

convert -density 150 -threshold 50% input.pdf output.pdf
Marco
sumber
Terima kasih! Salah satu masalah menjalankan perintah pertama: pdf skala abu-abu asli adalah sekitar 25MB, dan proses belum selesai setelah 15 menit, dan file output mono.ps sudah 150MB dan masih meningkat. Saya khawatir tentang itu. Adakah cara lain, misalnya, mencetak ke file BW pdf?
Tim
@ Tim Itu tidak biasa. File PostScript tidak terkompresi, PDF yang dihasilkan akan lebih kecil.
Marco
Terima kasih. Butuh sekitar 20 menit. BW pdf tidak bagus. dan file aslinya ada di sini
Tim
@Tim kualitas mengerikan, tidak cocok untuk OCR apa pun yang Anda lakukan.
frostschutz
4

Cara terbaik yang saya temukan di sana, tanpa kehilangan kualitas, menghilangkan bayangan, kebisingan, teks dari halaman berikutnya, berdarah, dll:

1) Pertama-tama, konversi pdf ke gambar individual

pdfimages combined_ocr.pdf page

2) Kedua menghapus bayangan, noise, teks dari halaman berikutnya melalui (kredit ke blog ini )

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

ini dapat ditambahkan sebagai langkah tambahan atau sebagai ganti perintah di atas untuk hanya mendapatkan dua warna:

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

3) Ini untuk membuat file pdf dari setiap gambar jpg tanpa kehilangan resolusi atau kualitas:

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

4) Ini untuk menggabungkan halaman pdf menjadi satu:

pdftk *.pdf cat output combined.pdf

5) Dan terakhir saya menambahkan layer teks OCR yang tidak mengubah kualitas pemindaian di pdf sehingga dapat dicari:

pypdfocr combined.pdf 
Eduard Florinescu
sumber
3

Saya juga memiliki beberapa pdf warna yang dipindai dan pdf abu-abu yang ingin saya konversi menjadi bw. Saya mencoba menggunakan gsdengan kode yang tercantum di sini , dan kualitas gambar bagus dengan teks pdf masih ada. Namun, kode gs itu hanya mengkonversi ke skala abu-abu (seperti yang ditanyakan dalam pertanyaan) dan masih memiliki ukuran file yang besar. convertmenghasilkan hasil yang sangat buruk bila digunakan secara langsung.

Saya ingin pw bw dengan kualitas gambar yang baik dan ukuran file yang kecil. Solusi saya gunakan gsuntuk mengekstrak file bmp skala abu-abu dari pdf, convertuntuk membatasi bmps menjadi bw dan menyimpannya sebagai file tiff, dan kemudian img2pdf untuk mengompres gambar tiff dan menggabungkan semuanya menjadi satu pdf.

Saya mencoba langsung tiff dari pdf tapi kualitasnya tidak sama jadi saya menyimpan setiap halaman ke bmp. Untuk file pdf satu halaman, convertlakukan pekerjaan yang hebat dari bmp ke pdf. Contoh:

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

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

Untuk beberapa halaman, gsdapat menggabungkan beberapa file pdf menjadi satu, tetapi img2pdfmenghasilkan ukuran file yang lebih kecil daripada gs. File tiff harus dikompres sebagai input ke img2pdf. Ingatlah untuk banyak halaman, file bmp dan tiff menengah cenderung berukuran besar. pdftkatau joinpdfakan lebih baik jika mereka dapat menggabungkan file pdf terkompresi dari convert.

Saya membayangkan ada solusi yang lebih elegan. Namun, metode saya menghasilkan hasil dengan kualitas gambar yang sangat baik dan ukuran file yang jauh lebih kecil. Untuk mendapatkan kembali teks dalam bw pdf, jalankan OCR lagi.

Script shell saya menggunakan gs, convert, dan img2pdf. Ubah parameter (# halaman, pindai dpi, ambang batas%, dll) yang tercantum di awal sesuai kebutuhan, dan jalankan chmod +x ./pdf2bw.sh. Berikut ini skrip lengkap (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
Pisau cukur Occam
sumber
2

Sebenarnya, jika itu berasal dari pemindaian, satu-satunya cara yang masuk akal adalah dengan menggunakan gambar pdf dan mengonversi gambar yang mendasarinya. Saya menggunakan skrip ini untuk mengubahnya:

#!/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
ondra
sumber
2

Terima kasih kepada OccamsRazor untuk skripnya, yang berhasil mengubah PDF warna dan skala abu-abu menjadi versi monokrom yang ringkas dan terbaca. Ini benar-benar komentar di posting OccamsRazor, tapi saya tidak punya cukup poin untuk berkomentar.

Script akan gagal img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files karena --dpitidak lagi menjadi argumen yang diterima untuk img2pdf. Sebagai gantinya, ia mendapatkan resolusi dari file input, jadi Anda bisa membiarkannya saja.

Ini versi naskah saya. Saya tidak ingin mengedit skrip untuk setiap file, jadi saya memasukkan jumlah halaman dan memasukkan nama file ketika saya menjalankannya. Saya memiliki nama keluaran set untuk dan set resolusi 200 dpi, yang bekerja untuk alur kerja saya, tetapi Anda mungkin ingin mengubahnya, atau mengubahnya menjadi dan dan melewati mereka di.00input_name$3$4

Untuk menjalankan, gunakan , misalnya ,../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
lowwall
sumber
Anda harus mengutip variabel shell Anda; terutama yang berasal dari argumen atau input pengguna lain: misalnya, "./$input_pdf_name"dan bahkan seq 1 "$num_pages". Juga, Anda mungkin ingin mengubah `…`ke $(…)- lihat ini , ini , dan ini .
G-Man Mengatakan 'Reinstate Monica'
Ini adalah skrip OccamsRazor kecuali untuk perubahan yang saya catat. Saya bukan programmer shell, jadi saya tidak ingin mengacaukan sesuatu yang berhasil. Tetapi jika ada yang ingin membersihkan ini, terima kasih.
lowwall