컬러 PDF를 흑백으로 변환하는 방법은 무엇입니까?

컬러 PDF를 흑백으로 변환하는 방법은 무엇입니까?

크기를 줄이기 위해 컬러 텍스트와 이미지가 포함된 PDF를 흑백만 포함된 다른 PDF로 변환하고 싶습니다. 또한 그림의 페이지 요소를 변환하지 않고 텍스트를 텍스트로 유지하고 싶습니다. 다음 명령을 시도했습니다.

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

다른 질문에서 발견되었습니다.링크, 그러나 내가 원하지 않는 작업을 수행합니다. 출력의 텍스트가 불량한 이미지로 변환되어 더 이상 선택할 수 없습니다. 나는 Ghostscript로 시도했습니다.

gs      -sOutputFile=output.pdf \
        -q -dNOPAUSE -dBATCH -dSAFER \
        -sDEVICE=pdfwrite \
        -dCompatibilityLevel=1.3 \
        -dPDFSETTINGS=/screen \
        -dEmbedAllFonts=true \
        -dSubsetFonts=true \
        -sColorConversionStrategy=/Mono \
        -sColorConversionStrategyForImages=/Mono \
        -sProcessColorModel=/DeviceGray \
        $1

하지만 다음과 같은 오류 메시지가 나타납니다.

./script.sh: 19: ./script.sh: output.pdf: not found

파일을 만드는 다른 방법이 있나요?

답변1

GS의 예

위에서 실행 중인 명령 에는 일반적으로 명령줄 인수를 스크립트에 전달하기 위한 gs후행이 있습니다 . $1그래서 실제로 무엇을 시도했는지는 잘 모르겠지만 해당 명령을 스크립트에 넣으려고 한 것 같습니다 script.sh.

#!/bin/bash

gs      -sOutputFile=output.pdf \
        -q -dNOPAUSE -dBATCH -dSAFER \
        -sDEVICE=pdfwrite \
        -dCompatibilityLevel=1.3 \
        -dPDFSETTINGS=/screen \
        -dEmbedAllFonts=true \
        -dSubsetFonts=true \
        -sColorConversionStrategy=/Mono \
        -sColorConversionStrategyForImages=/Mono \
        -sProcessColorModel=/DeviceGray \
        $1

그리고 다음과 같이 실행하세요.

$ ./script.sh: 19: ./script.sh: output.pdf: not found

이 스크립트를 어떻게 설정했는지는 잘 모르겠지만 실행 가능해야 합니다.

$ chmod +x script.sh

하지만 해당 스크립트에는 확실히 뭔가가 잘못된 것 같습니다. 시도했을 때 대신 다음 오류가 발생했습니다.

복구할 수 없는 오류: .putdeviceprops의 범위 확인

대안

해당 스크립트 대신 SU 질문의 이 스크립트를 사용하겠습니다.

#!/bin/bash

gs \
 -sOutputFile=output.pdf \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
 $1

그런 다음 다음과 같이 실행하십시오.

$ ./script.bash LeaseContract.pdf 
GPL Ghostscript 8.71 (2010-02-10)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
Page 2

답변2

스크립트를 찾았어요여기그것은 이것을 할 수 있습니다. 그것은 gs당신이 갖고 있는 것처럼 보이지만 또한pdftk. 배포판을 언급하지 않았지만 Debian 기반 시스템에서는 다음을 사용하여 설치할 수 있습니다.

sudo apt-get install pdftk

RPM을 찾을 수 있습니다.여기.

를 설치한 후 pdftk스크립트를 다음과 같이 저장 graypdf.sh하고 다음과 같이 실행합니다.

./greypdf.sh input.pdf

이라는 파일이 생성됩니다 input-gray.pdf. 링크 부패를 방지하기 위해 여기에 전체 스크립트를 포함합니다.

# convert pdf to grayscale, preserving metadata
# "AFAIK graphicx has no feature for manipulating colorspaces. " http://groups.google.com/group/latexusersgroup/browse_thread/thread/5ebbc3ff9978af05
# "> Is there an easy (or just standard) way with pdflatex to do a > conversion from color to grayscale when a PDF file is generated? No." ... "If you want to convert a multipage document then you better have pdftops from the xpdf suite installed because Ghostscript's pdf to ps doesn't produce nice Postscript." http://osdir.com/ml/tex.pdftex/2008-05/msg00006.html
# "Converting a color EPS to grayscale" - http://en.wikibooks.org/wiki/LaTeX/Importing_Graphics
# "\usepackage[monochrome]{color} .. I don't know of a neat automatic conversion to monochrome (there might be such a thing) although there was something in Tugboat a while back about mapping colors on the fly. I would probably make monochrome versions of the pictures, and name them consistently. Then conditionally load each one" http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2005-08/msg01864.html
# "Here comes optional.sty. By adding \usepackage{optional} ... \opt{color}{\includegraphics[width=0.4\textwidth]{intro/benzoCompounds_color}} \opt{grayscale}{\includegraphics[width=0.4\textwidth]{intro/benzoCompounds}} " - http://chem-bla-ics.blogspot.com/2008/01/my-phd-thesis-in-color-and-grayscale.html
# with gs:
# http://handyfloss.net/2008.09/making-a-pdf-grayscale-with-ghostscript/
# note - this strips metadata! so:
# http://etutorials.org/Linux+systems/pdf+hacks/Chapter+5.+Manipulating+PDF+Files/Hack+64+Get+and+Set+PDF+Metadata/
COLORFILENAME=$1
OVERWRITE=$2
FNAME=${COLORFILENAME%.pdf}
# NOTE: pdftk does not work with logical page numbers / pagination;
# gs kills it as well;
# so check for existence of 'pdfmarks' file in calling dir;
# if there, use it to correct gs logical pagination
# for example, see
# http://askubuntu.com/questions/32048/renumber-pages-of-a-pdf/65894#65894
PDFMARKS=
if [ -e pdfmarks ] ; then
PDFMARKS="pdfmarks"
echo "$PDFMARKS exists, using..."
# convert to gray pdf - this strips metadata!
gs -sOutputFile=$FNAME-gs-gray.pdf -sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH "$COLORFILENAME" "$PDFMARKS"
else # not really needed ?!
gs -sOutputFile=$FNAME-gs-gray.pdf -sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH "$COLORFILENAME"
fi
# dump metadata from original color pdf
## pdftk $COLORFILENAME dump_data output $FNAME.data.txt
# also: pdfinfo -meta $COLORFILENAME
# grep to avoid BookmarkTitle/Level/PageNumber:
pdftk $COLORFILENAME dump_data output | grep 'Info\|Pdf' > $FNAME.data.txt
# "pdftk can take a plain-text file of these same key/value pairs and update a PDF's Info dictionary to match. Currently, it does not update the PDF's XMP stream."
pdftk $FNAME-gs-gray.pdf update_info $FNAME.data.txt output $FNAME-gray.pdf
# (http://wiki.creativecommons.org/XMP_Implementations : Exempi ... allows reading/writing XMP metadata for various file formats, including PDF ... )
# clean up
rm $FNAME-gs-gray.pdf
rm $FNAME.data.txt
if [ "$OVERWRITE" == "y" ] ; then
echo "Overwriting $COLORFILENAME..."
mv $FNAME-gray.pdf $COLORFILENAME
fi
# BUT NOTE:
# Mixing TEX & PostScript : The GEX Model - http://www.tug.org/TUGboat/Articles/tb21-3/tb68kost.pdf
# VTEX is a (commercial) extended version of TEX, sold by MicroPress, Inc. Free versions of VTEX have recently been made available, that work under OS/2 and Linux. This paper describes GEX, a fast fully-integrated PostScript interpreter which functions as part of the VTEX code-generator. Unless specified otherwise, this article describes the functionality in the free- ware version of the VTEX compiler, as available on CTAN sites in systems/vtex.
# GEX is a graphics counterpart to TEX. .. Since GEX may exercise subtle influence on TEX (load fonts, or change TEX registers), GEX is op- tional in VTEX implementations: the default oper- ation of the program is with GEX off; it is enabled by a command-line switch.
# \includegraphics[width=1.3in, colorspace=grayscale 256]{macaw.jpg}
# http://mail.tug.org/texlive/Contents/live/texmf-dist/doc/generic/FAQ-en/html/FAQ-TeXsystems.html
# A free version of the commercial VTeX extended TeX system is available for use under Linux, which among other things specialises in direct production of PDF from (La)TeX input. Sadly, it���s no longer supported, and the ready-built images are made for use with a rather ancient Linux kernel.
# NOTE: another way to capture metadata; if converting via ghostscript:
# http://compgroups.net/comp.text.pdf/How-to-specify-metadata-using-Ghostscript
# first:
# grep -a 'Keywo' orig.pdf
# /Author(xxx)/Title(ttt)/Subject()/Creator(LaTeX)/Producer(pdfTeX-1.40.12)/Keywords(kkkk)
# then - copy this data in a file prologue.ini:
#/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
#[/Author(xxx)
#/Title(ttt)
#/Subject()
#/Creator(LaTeX with hyperref package + gs w/ prologue)
#/Producer(pdfTeX-1.40.12)
#/Keywords(kkkk)
#/DOCINFO pdfmark
#
# finally, call gs on the orig file,
# asking to process pdfmarks in prologue.ini:
# gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
# -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -dDOPDFMARKS \
# -sOutputFile=out.pdf in.pdf prologue.ini
# then the metadata will be in output too (which is stripped otherwise;
# note bookmarks are preserved, however). 

답변3

또한 흑백으로 변환하고 싶은 스캔된 컬러 PDF와 회색조 PDF도 있었습니다. 나는 사용해 보았다.gs여기에 나열된 코드, PDF 텍스트가 그대로 남아있어 이미지 품질이 좋습니다. 그러나 해당 GS 코드는 질문에서 묻는 대로 회색조로만 변환되며 여전히 파일 크기가 큽니다. convert직접 사용하면 결과가 매우 나쁩니다.

저는 이미지 품질이 좋고 파일 크기가 작은 bw pdf를 원했습니다. 나는 terdon의 솔루션을 시도했지만 pdftk(작성 당시) yum을 사용하여 centOS 7을 사용할 수 없었습니다.

내 솔루션은 gsPDF에서 회색조 bmp 파일을 추출하는 데 사용됩니다.convert 해당 bmp를 bw로 임계값으로 설정한 다음 tiff 파일로 저장하는 데 사용됩니다.img2pdfTiff 이미지를 압축하고 모두 하나의 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, 변환 및 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

답변4

8.70의 기본 Ghostscript인 RHEL6 및 RHEL5는 위에 제공된 명령 형식을 사용할 수 없습니다. PDF 파일을 첫 번째 인수 "$1"로 예상하는 스크립트나 함수를 가정하면 다음이 더 이식성이 높아야 합니다.

gs \
    -sOutputFile="grey_$1" \
    -sDEVICE=pdfwrite \
    -sColorConversionStrategy=Mono \
    -sColorConversionStrategyForImages=/Mono \
    -dProcessColorModel=/DeviceGray \
    -dCompatibilityLevel=1.3 \
    -dNOPAUSE -dBATCH \
    "$1"

출력 파일 앞에 "grey_"가 붙습니다.

RHEL6 및 5는 다음을 사용할 수 있습니다.호환성레벨=1.4훨씬 빠르지만 이식성을 목표로 삼았습니다.

관련 정보