PDF 파일을 그레이 스케일에서 흑백으로 변환하려면 어떻게해야합니까?


11

내 OS는 Ubuntu 12.04입니다. PDF 파일을 그레이 스케일에서 흑백으로 변환하려면 어떻게해야합니까? 그레이 스케일 pdf 파일은 그레이 스케일 옵션을 사용한 스캔에서 제공되며 OCR에는 흑백 스케일 pdf가 필요합니다.


최신 정보:

Marco의 답변에 따르면 BW pdf 는 좋지 않으며 원본 파일은 여기에 있습니다 .


시도scantailor
frostschutz

scantailorOCR 스캔을 준비 할 때 유용한 기능이 많이 있습니다. 이것이 제가 제안한 유일한 이유입니다 (답이 아닌 의견)
frostschutz

libreoffice에서 (최소 일부) .pdf 파일을 열고 내보낼 수 있습니다 (따라서 가장 현대적인 워드 프로세서를 추측 할 것입니다). 그것이 원하는 변경을 가능하게하거나 쉽게 만들 수 있는지 모릅니다.
goldilocks

1
pdfimagesPDF 컨테이너에서 스캔 한 이미지를 추출 할 수도 있습니다 . 우선 ImageMagick으로 처리하는 것이 더 효율적일 수 있습니다.
frostschutz

답변:


9

1) 고스트 스크립트 를 사용하여 psmono 장치를 사용하여 PDF를 흑백 PostScript 파일로 변환하십시오 .

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

2) 흑백 포스트 스크립트를 다시 PDF로 변환하십시오.

ps2pdf mono.ps

편집 :psmono 장치 당신이 원하는 것을 분명히하지 않는 한 비트 하프 톤 이미지를 만듭니다. 고스트 스크립트를 사용하여 임계 값을 지정하는 방법을 찾을 수 없으므로 imagemagick에 의지했습니다. convert내부적으로 고스트 스크립트를 사용하여 PDF를 변환합니다. 그런 다음 임계 값 필터링을 적용하여 1 비트 이미지를 생성하고 고스트 스크립트를 다시 사용하여 PDF를 만듭니다. convert기본적으로 75DPI의 해상도를 사용 하므로 실제 해상도와 일치하지 않을 수 있으므로 density인수를 제공 할 수 있습니다 . threshold설정을 실험 해보십시오 . 최적의 값은 입력 파일에 따라 크게 달라집니다.

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

감사! 첫 번째 명령을 실행하는 한 가지 문제 : 원본 회색조 pdf는 약 25MB이고 실행은 15 분 후에 아직 완료되지 않았으며 출력 파일 mono.ps는 이미 150MB이며 계속 증가하고 있습니다. 나는 그것에 대해 걱정하고 있습니다. 예를 들어 BW pdf 파일로 인쇄하는 다른 방법이 있습니까?
Tim

@Tim 드문 일이 아닙니다. PostScript 파일은 압축되지 않으며 결과 PDF는 더 작아집니다.
Marco

감사. 약 20 분이 걸렸습니다. BW pdf 가 좋지 않습니다. 원본 파일은 여기에 있습니다
Tim

@Tim 끔찍한 품질, 무엇을하든 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) 해상도 또는 품질 손실없이 모든 jpg 이미지에서 pdf 파일을 만듭니다.

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

4) 이것은 PDF 페이지를 하나로 연결합니다.

pdftk *.pdf cat output combined.pdf

5) 마지막으로 검색 가능한 PDF 파일의 스캔 품질을 변경하지 않는 OCR 텍스트 레이어를 추가합니다.

pypdfocr combined.pdf 

3

또한 bw로 변환하려는 스캔 한 컬러 pdf 및 회색조 pdf도있었습니다. 나는 사용하여 시도 gs여기에 나열된 코드 및 이미지 품질은 여전히 PDF 텍스트 좋다. 그러나 gs 코드는 (질문에서 요청한대로) 그레이 스케일로만 변환되며 여전히 파일 크기가 큽니다. convert직접 사용할 때 결과가 매우 나쁩니다.

좋은 이미지 품질과 작은 파일 크기의 bw pdf를 원했습니다. 내 솔루션은 gspdf에서 그레이 스케일 bmp 파일을 추출하고 bmp convert를 bw로 임계 값으로 설정하고 tiff 파일로 저장 한 다음 img2pdf 를 사용하여 tiff 이미지를 압축하고 하나의 pdf로 병합합니다.

pdf에서 직접 tiff로 이동하려고 시도했지만 품질이 같지 않으므로 각 페이지를 bmp로 저장합니다. 한 페이지 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 파일을 하나로 병합 할 수 있지만 img2pdfgs보다 파일 크기가 작습니다. 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를 모두 작고 읽기 쉬운 단색 버전으로 변환하는 데 큰 도움이됩니다. 이것은 실제로 OccamsRazor의 게시물에 대한 의견이지만, 언급 할 의견이 충분하지 않습니다.

더 이상 img2pdf에 허용되는 인수가 아니므 img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files 로 스크립트가 실패합니다 --dpi. 대신 입력 파일에서 해상도를 얻으므로 그대로 둘 수 있습니다.

여기 내 스크립트 버전이 있습니다. 모든 파일에 대한 스크립트를 편집하고 싶지 않았으므로 실행할 때 페이지 수를 입력하고 파일 이름을 입력하십시오. 나는 출력 이름 집합이 내 워크 플로우 작동 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

이것은 내가 언급 한 변경 사항을 제외하고 OccamsRazor의 스크립트입니다. 저는 쉘 프로그래머가 아니기 때문에 작동하는 것을 엉망으로 만들고 싶지 않았습니다. 그러나 누군가 이것을 정리하고 싶다면 내 감사합니다.
lowwall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.