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

컬러 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. 배포판에 대해서는 언급하지 않았지만 데비안 기반 시스템에서는 다음을 사용하여 설치할 수 있습니다.

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직접 사용하면 효과가 좋지 않습니다.

이미지 품질이 좋고 파일 크기가 작은 흑백 PDF를 원합니다. terdon의 솔루션을 시도해 보았지만 pdftkyum을 사용하여 centOS 7에 들어갈 수 없습니다(작성 ​​당시).

gsPDF에서 회색조 bmp 파일을 추출하고, convert이러한 bmp를 bw로 임계값으로 설정하고, tiff 파일로 저장하는 솔루션입니다 .이미지2pdfTIFF 이미지를 압축하여 하나의 PDF로 병합합니다.

pdf에서 tiff로 직접 이동해 보았지만 품질이 같지 않아 각 페이지를 bmp로 저장했습니다. 한 페이지 PDF 파일의 경우 convertbmp to 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 파일을 하나로 병합할 수 있지만 img2pdf결과 파일 크기는 gs보다 작습니다. tiff 파일은 img2pdf에 대한 입력으로 압축을 풀어야 합니다. 페이지 수가 많으면 중간 bmp 및 tiff 파일의 크기가 커지는 경향이 있습니다. pdftk아니면 joinpdf압축된 PDF 파일을 병합할 수 있다면 더 좋을 것입니다 convert.

좀 더 우아한 솔루션을 원합니다. 그러나 내 방법을 사용하면 이미지 품질이 매우 좋고 파일 크기가 더 작은 결과를 얻을 수 있습니다. 텍스트를 흑백 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

RHEL6 및 RHEL5(둘 다 Ghostscript의 기본 버전이 8.70임)는 위에 제공된 명령 형식을 사용할 수 없습니다. 스크립트나 함수가 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훨씬 빠르지만 내 목표는 이식성입니다.

관련 정보