Bir pdf dosyasını gri tonlamadan siyah-beyaza nasıl dönüştürebilirim?


11

İşletim sistemim Ubuntu 12.04. Bir pdf dosyasını gri tonlamadan siyah-beyaza nasıl dönüştürebilirim? Gri tonlamalı pdf dosyası, gri tonlama seçeneğiyle taramadan gelir ve siyah-beyaz ölçekli pdf OCR tarafından gereklidir.


Güncelleme:

Marco'nun cevabından sonra , BW pdf iyi değil ve orijinal dosya burada .


deneyinscantailor
frostschutz

scantailorOCR için taramalar hazırlarken tonlarca başka yararlı özelliğe sahiptir ve bunu
önermem

Libreoffice'de (ve en azından bazı) .pdf'leri açabilir ve dışa aktarabilirsiniz (ve dolayısıyla en modern kelime işlemcilerini tahmin ederim). Bu istediğiniz değişikliği mümkün veya kolay hale getirecek bilmiyorum tho.
goldilocks

1
Ayrıca pdfimagesPDF kabından taranan görüntüleri çıkarmak için (poppler) vardır . Bunları ilk etapta ImageMagick ile ele almak daha verimli olabilir.
frostschutz

Yanıtlar:


9

1) PDF'yi psmono cihazını kullanarak tek renkli bir PostScript dosyasına dönüştürmek için ghostscript kullanın :

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

2) Ardından tek renkli PostScript'i tekrar PDF'ye dönüştürün:

ps2pdf mono.ps

DÜZENLEME:psmono Cihaz istediğini görünüşte olmayan bir 1 bitlik yarım ton görüntü oluşturur. Ben ghostscript kullanarak bir eşik belirtmek için bir yol bulamadım, bu yüzden imagemagick başvurdu. convertPDF'yi dönüştürmek için dahili olarak ghostscript kullanır. Daha sonra 1 bitlik bir görüntü oluşturmak için eşik filtresini uygular ve PDF oluşturmak için tekrar ghostscript kullanır. Yana convertkullanımları gerçek çözünürlüğü aynı olmayabilir varsayılan olarak 75DPI bir karar, sen sağlayabilir densityargüman. Ve bu thresholdayarı deneyin . En uygun değerler büyük ölçüde giriş dosyasına bağlıdır.

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

Teşekkürler! İlk komutu çalıştırmanın bir problemi: orijinal gri tonlamalı pdf yaklaşık 25 MB'tır ve 15 dakika sonra çalışma henüz bitmedi ve mono.ps çıktı dosyası zaten 150 MB ve hala artıyor. Bunun için endişeleniyorum. BW pdf dosyasına yazdırmanın başka yolları var mı?
Tim

@Zaman Bu nadir değil. PostScript dosyaları sıkıştırılmamış, sonuçta ortaya çıkan PDF daha küçük olacaktır.
Marco

Teşekkürler. Yaklaşık 20 dakika sürdü. BW pdf iyi değil. ve orijinal dosya burada
Tim

@Zaman korkunç kalite, ne yaparsanız yapın OCR için uygun değil.
frostschutz

4

Orada kalite kaybı olmadan öğrendim en iyi yolu gölgeler, gürültü, metin sonraki kanama vb kaldırır:

1) Önce pdf dosyasını tek tek resimlere dönüştürün

pdfimages combined_ocr.pdf page

2) İkincisi sonraki sayfadan gölgeleri, gürültüyü, metni kaldırın ( bu bloga verilen krediler )

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

bu sadece iki renk elde etmek için ekstra adım olarak veya yukarıdaki komut yerine eklenebilir:

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

3) Bu, çözünürlük veya kalite kaybı olmadan her jpg görüntüsünden bir pdf dosyası yapmak için:

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

4) Bu, pdf sayfalarını bir araya getirmek için:

pdftk *.pdf cat output combined.pdf

5) Ve son olarak, arama yapılabilmesi için pdfs'deki taramanın kalitesini değiştirmeyen bir OCRed metin katmanı ekliyorum:

pypdfocr combined.pdf 

3

Ayrıca bw dönüştürmek istediğim bazı taranmış renkli pdfs ve gri tonlamalı pdfs vardı. Burada listelenen kodgs ile kullanmayı denedim ve görüntü kalitesi hala orada pdf metin ile iyidir. Bununla birlikte, bu gs kodu yalnızca (sorguda sorulduğu gibi) gri tonlamaya dönüştürülür ve yine de büyük dosya boyutuna sahiptir. doğrudan kullanıldığında çok kötü sonuçlar verir.convert

İyi görüntü kalitesi ve küçük dosya boyutu ile bw pdfs istedim. Benim çözümüm, gsgri tonlamalı bmp dosyalarını pdf'den ayıklamak , bu bmp'lericonvert bw ile eşleştirmek ve tiff dosyaları olarak kaydetmek ve sonra tiff görüntülerini sıkıştırmak ve hepsini tek bir pdf olarak birleştirmek için img2pdf'yi kullanır.

Doğrudan pdf tiff gitmeye çalıştım ama kalite aynı değil bu yüzden bmp her sayfa kaydedin. Bir sayfa pdf dosyası için, convertbmp'den pdf'ye harika bir iş çıkarır. Misal:

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

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

Birden fazla sayfa için, gsbirden fazla pdf dosyasını tek bir dosyada birleştirebilir, ancak img2pdfgs'den daha küçük dosya boyutu sağlar. Tiff dosyaları img2pdf dosyasına girdi olarak sıkıştırılmamış olmalıdır. Çok sayıda sayfa için aklınızda bulundurun, ara bmp ve tiff dosyalarının boyutu büyüktür. pdftkveya joinpdfsıkıştırılmış pdf dosyalarını birleştirebilirlerse daha iyi olur convert.

Daha zarif bir çözüm olduğunu hayal ediyorum. Ancak yöntemim, çok iyi görüntü kalitesine ve çok daha küçük dosya boyutuna sahip sonuçlar üretir. Bw pdf içine metin geri almak için OCR'ı tekrar çalıştırın.

Kabuk betiğim gs, convert ve img2pdf kullanıyor. Başlangıçta listelenen parametreleri (sayfa sayısı, tarama dpi'si,% eşiği vb.) Gerektiği gibi değiştirin ve çalıştırın chmod +x ./pdf2bw.sh. İşte tam komut dosyası (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

Aslında, bir taramadan geliyorsa, tek makul yol pdfimages'i kullanmak ve alttaki grafikleri dönüştürmektir. Dönüştürmek için bu komut dosyasını kullandım:

#!/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

Hem renkli hem de gri tonlamalı PDF'leri kompakt ve okunaklı tek renkli bir sürüme dönüştürmek için harika bir iş yapan senaryosu için OccamsRazor'a teşekkürler. Bu gerçekten OccamsRazor'un gönderisine bir yorum, ancak yorum yapmak için yeterli puanım yok.

Komut başarısız olur img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files olarak --dpiartık Img2PDF için kabul edilen bir argümandır. Bunun yerine, çözünürlüğü giriş dosyasından alır, böylece dışarıda bırakabilirsiniz.

İşte benim senaryo versiyonu. Her dosya için komut dosyasını düzenlemek istemedim, bu yüzden çalıştırdığımda sayfa sayısını ve girdi dosya adını giriyorum. Ben çıkış adı ayarlanmamış benim iş akışı için çalışır 200 dpi, ve çözünürlük seti, ancak bunu değiştirmek isteyen veya bunları dönüşebilir ve ve bunları geçmektedir.00input_name$3$4

Çalıştırmak için , örneğin kullanın ../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

Kabuk değişkenlerinizi belirtmelisiniz; özellikle bağımsız değişkenlerden veya diğer kullanıcı girdilerinden gelenler: örneğin, "./$input_pdf_name"ve hatta seq 1 "$num_pages". Ayrıca, değiştirmek isteyebilirsiniz `…`için $(…)- bkz bu , bu ve bu .
G-Man

Bu, kaydettiğim değişiklikler dışında OccamsRazor'un senaryosu. Ben kabuk programcısı değilim, bu yüzden işe yarayan bir şeyle uğraşmak istemedim. Ama bunu temizlemek isteyen varsa, teşekkür ederim.
lowwall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.