[Cookbook] PDF, 이럴 때 이렇게 한다. feat Ghostscript
배경
PDF는 전자문서의 표준으로 다양한 분야에서 사용되고 있다. PDF를 보는 것은 Adobe Acrobat Reader DC나 foxit reader를 통해 쉽게 할 수 있다.
그러나 편집을 하려고 하면 문제가 복잡해진다. 주머니 사정이 괜찮다면 Adobe Acrobat Pro DC를 구입하여 사용하는 편이 정신건강에 좋다. 사용하기도 쉽고, 제공하는 기능도 다양하다. 하지만 PDF 파일을 단순히 병합하거나 분리하거나 하기 위해 고가의 프로그램을 구입해야 할까.
다른 방법도 있다. postscrip를 다루기 위해 만들어진 Ghostscript를 이용하면 된다. Windows10 부터는 WSL(Windows Subsystem For Linux)을 통해 linux를 이용할 수 있기 때문에 사용 가능하다.
Ghostscript에 대해서는 이전 글 PDF 용량 축소하기 (with Ghostscript)에서 소개한 바 있다.
내용이 많아 따로 작성한 페이지
- PDF 파일에 Bookmark 목차를 넣어보자
- PDF 양면보기 좌우 위치 바꾸기(feat. Foxit PDF Reader)
- OCR을 통해 PDF를 검색하고 글자를 복사해오자.
- PDF 용량 축소하기 (with Ghostscript)
- djvu 파일을 pdf로 바꿔보자
Ghostscript
설치
먼저 설치한다. 간단하게 apt-get으로 설치할 수 있다. windows의 경우, wsl 환경으로 들어가서 실행시킨다.
sudo apt-get install ghostscript
최신 버전을 설치하려면 Ghostscript 공식 홈페이지에서 다운로드 받아 설명된 설치 방법에 따른다.
사용법(일부)
자세한 사용법은 공식 홈페이지의 설명을 참조하라. 공식 설명이 너무 길기 때문에 gs (GhostScript) cheat sheet을 먼저 보자.
-dBATCH
: 파일 변환후GS>
프럼프트를 표시하지 않고 종료-dNOPAUSE
: 페이지마다 멈추지 않고 계속 진행-sDEVICE
: 출력형식을 지정. PDF라면-sDEVICE=pdfwrite
-sOutputFile
: 결과물을 OutputFile로 저장한다.
PDF 용량 축소
PDF 용량 축소하기 (with Ghostscript)을 참조하라.
PDF 병합
여러개의 PDF를 하나의 PDF로 병합해 보자.
대상이 되는 파일이 input1.pdf, input2.pdf이고, 결과 파일 명을 merged.pdf라고 하였을 때, 다음과 같이 할 수 있다. -dPDFSETTINGS=/prepress
는 압축을 위한 것이므로 생략할 수 있다.
# merge pdf
gs -dBATCH -dNOPAUSE -q \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-sOutputFile=merged.pdf \
input1.pdf input2.pdf
현재 폴더에 있는 파일 전체를 merged.pdf로 합치려면 다음과 같이 해야 한다. 이때 ls
를 통해 파일 순서를 먼저 살펴보자. 파일이 원하는 순서로 정렬되지 않았다면 파일 이름을 바꾸거나 해야 한다.
# merge pdf of folder
gs -dBATCH -dNOPAUSE -q \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-sOutputFile=merged.pdf \
*
페이지 추출
특정 페이지를 추출할 수 있다. input.pdf 파일에서 3페이지만을 추출하여 output.pdf로 만들고자 한다면 다음과 같이 할 수 있다.
gs -q -dBATCH -dNOPAUSE \
-sDEVICE=pdfwrite \
-dFirstPage=3 \
-dLastPage=3 \
-sOutputFile=output.pdf input.pdf
PDF 색반전
가끔 PPT를 PDF로 변환한 경우, 배경이 검은색일 때가 있다. 검은색 배경은 눈의 피로를 줄여주지만, 이를 출력하면 대참사가 벌어진다. 이럴 때는 색반전(invert)을 통해 검은색을 흰색으로, 흰색을 검은색으로 바꿔준 뒤에 출력해야 한다. 좀 복잡하지만 아래와 같이 하면 된다. 원본 파일이 input.pdf이고 결과 파일이 inverted.pdf이다.
# invert color
gs -sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-c "{1 exch sub}{1 exch sub}{1 exch sub}{1 exch sub} setcolortransfer" \
-o inverted.pdf
-f input.pdf
PDF를 image(jpg, png)로
DEVICE options
png16m
: 24-bit RGB colorpng256
: 8-bit colorpng16
: 4-bit color
pnggray
: grayscalepngmono
: black-and-white for special needs
pngalpha
: 32-bit RGBA color with transparency indicating pixel coverage. (The background is transparent unless it has been explicitly filled)
gs -dNOPAUSE -dBATCH \
-sDEVICE=png16m \
-r100x100 \
-sOutputFile=page-%03d.jpg \
target.pdf
※ ghostscript는 pdf를 다루는 library이므로 image를 PDF로 만드는 일은 하기 어렵다. 이 작업은 ImageMagick을 이용하여 할 수 있다. 다만 용량이 늘어나는 문제가 생길 수 있다. 따라서 -compress jpeg
옵션이 필요하다.
convert -compress jpeg *.jpg output.pdf
PDF 회전
아래와 같이 하면 된다. 하지만 결과가 내가 원하는 것과 다르게 나타날 수 있다. 자세한 내용은 여기를 참조하자.
gs -dNOPAUSE -dBATCH -q\
-sDEVICE=pdfwrite \
-c "<</Orientation 2>> setpagedevice" \
-sOutputFile=output.pdf \
input.pdf
ghostscript로 페이지를 임의로 회전하는 것은 어려운 것 같다. 이 역시 ImageMagick을 사용하자
convert -rotate -90 -density 200 input.pdf output.pdf
PDF unlock
잠겨 있는(locked) pdf인 경우 PDF를 OCR 하거나 일부 잘라내는 등의 가공을 할 수 없다. 이럴 때는 “unlcok pdf”라는 키워드로 검색하여 나오는 smallpdf, sodapdf 등 온라인 툴로 해결할 수 있다. 하지만 하나하나 해결해야 하므로 번거롭고, 개수 제한이 걸려 있는 걸려 있는 경우에는 충분히 사용할 수 없다. 원칙적으로는 password를 알아야 하지만 잃어버린 경우에는 방법이 없다.
QPDF
이런 경우 qpdf를 이용할 수 있다. qpdf는 C++ 라이브러리로 콘텐츠 보호가 걸려 있는 pdf를 변환할 수 있다. qpdf를 설치한 뒤에 아래와 같이 실행하면 된다.
sudo apt-get install qpdf
qpdf --decrypt input.pdf output.pdf
비밀번호를 바꾸려면 아래와 같이 실행시킨다.
qpdf --decrypt --password=newpassword input.pdf output.pdf
unlock pdf과 관련된 여러 프로그램들은 여기를 참고하라.
Ghostscript
최후의 방법으로는 Ghostscript를 이용하여 다음과 같은 방법으로 이를 해결할 수 있다.
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=unencrypted.pdf -c .setpdfwrite -f encrypted.pdf
폴더에 있는 여러 파일에 모두 적용하려면 다음과 같이 한다.
for F in *;
do
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="un_${F}" -c .setpdfwrite -f "${F}"
done
make PDF searchable
문서를 그냥 스캔한 경우, 이미지로 내용을 확인할 수 있지만 텍스트를 복사하거나 검색할 수 없다. PDF 안에 그러한 데이터가 존재하지 않기 때문이다. 이런 경우 OCR을 한 후에 OCR 결과를 PDF에 layer로 삽입해 주어야 한다. Acrobat Pro DC를 사용하는 것이 정신건강에 좋다. 그러나 때때로 많은 파일을 일괄처리 하고 싶다면 open source program으로 해결할 수 있다. 검색 가능한 PDF 만들기(feat OCR)를 참조하라.