컬러 PDF를 흑백으로 변환하는 방법?


18

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

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

다른 질문 인 link 에서 발견 되었지만 원하지 않는 것을 수행합니다. 출력의 텍스트가 나쁜 이미지로 변환되어 더 이상 선택할 수 없습니다. 나는 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

파일을 만드는 다른 방법이 있습니까?


이것은 매우 좋아 보인다 superuser.com/questions/200378/…
slackmart


일부 수퍼 유저 접근 방식을 사용할 때는 PDF를 래스터 화 된 버전으로 변환하므로 더 이상 벡터 그래픽이 아닙니다.
slm

1
전체 스크립트를 실행 했습니까? 그것은 보이지 않습니다, 당신은 전체 스크립트를 게시 할 수 있습니까?
terdon

답변:


23

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의 rangecheck

대안

그 스크립트 대신 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

맞습니다. 스크립트에 문제가 있습니다.이 경우 "뭔가" sProcessColorModeldProcessColorModel대신 해야합니다 .
소라.

8

여기서 할 수 있는 스크립트를 찾았습니다 . 그것은 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

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

좋은 이미지 품질과 작은 파일 크기의 bw pdf를 원했습니다. 나는 terdon의 해결책을 시도했지만, pdftkyum (작성시)을 사용하여 centOS 7을 얻을 수 없었습니다 .

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

나는 pdf에서 직접 굳어 보려고했지만 품질이 같지 않으므로 각 페이지를 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

1

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는 CompatibilityLevel = 1.4 를 훨씬 더 빠르게 사용할 수 있지만 이식성을 목표로하고있었습니다.


개발자는 ( 1 , 2 , 3 , 4 ) sColorConversionStrategyForImages스위치 가 없다고 말합니다 .
Igor

고마워, @ 아이고-나는 그 발췌 문장을 어디서 얻었는지 전혀 모른다! 나는 그것을 테스트 한 사실을 알고 당시에 작동했습니다 . (그래서 여러분, 항상 코드에 대한 참조를 제공해야하는 이유입니다.)
Rich

1
이 "가짜 매개 변수"는 웹에서 매우 인기있는 것으로 보입니다. GS는 알 수없는 스위치 (슬픔)를 무시하므로 어쨌든 작동합니다.
Igor

1

이 스크립트와 대조적으로 스캔 한 PDF를 정리하여 신뢰할 수있는 결과를 얻습니다.

#!/bin/bash
# 
# $ sudo apt install poppler-utils img2pdf pdftk imagemagick
#
# Output is still greyscale, but lots of scanner light tone fuzz removed.
#

pdfimages $1 pages

ls ./pages*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 400 \
  -fill white -fuzz 80% -auto-level -depth 4 +opaque "#000000" {}.jpg

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

pdftk pages*.pdf cat output ${1/.pdf/}_bw.pdf

rm pages*
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.