PDFファイルをグレースケールから白黒に変換するにはどうすればよいですか?


11

私のOSはUbuntu 12.04です。PDFファイルをグレースケールから白黒に変換するにはどうすればよいですか?グレースケールpdfファイルは、グレースケールオプションでスキャンしたもので、OCRでは白黒スケールのpdfが必要です。


更新:

マルコの返答に続いて、BW pdfは良くなく、元のファイルはここにあります


試してみるscantailor
frostschutz 2013

scantailorOCRのスキャンの準備に関しては、他にもたくさんの便利な機能があり、それが私がそれを(コメントではなく、回答として)提案した唯一の理由です
frostschutz 2013

libreoffice内の(少なくともいくつかの).pdfを開いてエクスポートできます(したがって、最新のワードプロセッサを推測します)。それがあなたの望ましい変更を可能にするのか、それとも簡単にするのか分かりません。
goldilocks 2013

1
pdfimagesPDFコンテナーからスキャンした画像を抽出する(ポップラー)もあります。そもそもImageMagickでそれらを処理する方が効率的かもしれません。
frostschutz 2013

回答:


9

1)ghostscriptを使用して、psmonoデバイスを使用してPDFをモノクロのPostScriptファイルに変換します。

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

2)次に、モノクロPostScriptをPDFに変換します。

ps2pdf mono.ps

EDIT:psmonoデバイスが何をしたい、明らかではない1ビットのハーフトーン画像を作成します。ghostscriptを使用してしきい値を指定する方法が見つからなかったため、imagemagickを使用しました。convert内部では、ghostscriptを使用してPDFを変換します。次に、しきい値フィルタリングを適用して1ビット画像を作成し、再度ghostscriptを使用してPDFを作成します。convertはデフォルトで75DPIの解像度を使用するため、実際の解像度と一致しない場合があるため、density引数を指定できます。そして、threshold設定を試してみてください。最適値は入力ファイルに大きく依存します。

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

ありがとう!最初のコマンドを実行する際の1つの問題:元のグレースケールpdfは約25MBであり、実行が15分後にまだ完了しておらず、出力ファイルmono.psはすでに150MBであり、まだ増加しています。私はそれについて心配しています。BW pdfファイルに出力するなど、他の方法はありますか?
Tim

@ティムそれは珍しいことではありません。PostScriptファイルは圧縮されていないため、生成されるPDFは小さくなります。
マルコ

ありがとう。約20分かかりました。BW pdfは良くありません。元のファイルはこちら
Tim

@Timはひどい品質で、何をしてもOCRには適していません。
frostschutz 2013

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

これを追加のステップとして、または上記のコマンドの代わりに追加して、実際に2色のみを取得できます。

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

3)これは、解像度や品質を損なうことなく、すべてのjpg画像からpdfファイルを作成するためのものです。

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

4)これは、PDFページを1つに連結するためのものです。

pdftk *.pdf cat output combined.pdf

5)そして最後に、PDFのスキャンの品質を変更しないOCRedテキストレイヤーを追加して、検索可能にします。

pypdfocr combined.pdf 

3

また、bwに変換したいスキャン済みカラーPDFとグレースケールPDFもいくつか持っていました。ここ記載されgsているコードを使用してみましたが、PDFテキストがまだ残っているため、画質は良好です。ただし、そのgsコードは(質問で尋ねられたように)グレースケールにのみ変換され、ファイルサイズはまだ大きくなります。convert直接使用すると、結果が非​​常に悪くなります。

良い画像品質と小さなファイルサイズのbw pdfが欲しかった。私のソリューションではgs、pdfからグレースケールbmpファイルを抽出し、bmp convertをbwにしきい値化してtiffファイルとして保存し、次にimg2pdfを使用してtiff画像を圧縮し、すべてを1つのpdfにマージします。

pdfから直接tiffを実行しようとしましたが、品質が同じではないため、各ページをbmpに保存します。1ページのpdfファイルの場合、convertbmpから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ファイルを1つにマージできますが、img2pdfファイルサイズはgsよりも小さくなります。tiffファイルは、img2pdfへの入力として圧縮解除する必要があります。ページ数が多い場合は、中間のbmpおよびtiffファイルのサイズが大きくなる傾向があることに注意してください。pdftkまたはjoinpdf、からの圧縮PDFファイルをマージできる場合は、より良いでしょうconvert

もっとエレガントな解決策があると思います。ただし、私の方法では、非常に良好な画質とはるかに小さいファイルサイズで結果が生成されます。テキストをbw pdfに戻すには、OCRを再度実行します。

私のシェルスクリプトでは、gs、convert、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とグレースケール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が「モニカ

これは、私が指摘した変更を除いて、OccamsRazorのスクリプトです。私はシェルプログラマーではないので、機能するものをいじりたくありませんでした。しかし、誰かがこれを片付けたい場合は、あなたに感謝します。
ローウォール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.