문서 취합 및 쪽번호 매기기 자동화

enscript와 pdftk로 PDF의 머릿글과 페이지 번호를 추가하기

(주의) 한글(korean) 머릿글은 지원하지 않는다

WHY?

HWP는 일괄병합 기능을 지원하지 않는다.
80개 제안서를 일일이 합치고 쪽번호를 매기는 작업은 심히 괴롭다.
PDF로 바꿔서 CLI로 작업하는게 정신건강에 이롭다.

예제 상황

4개의 제안서를 받아 평가용 책자를 만드는 예제

제안서 PDF에 평가용 코드를 헤더로 넣기 → PDF 병합 → 쪽번호 추가

파일평가용 코드
(제안서별 머릿글)

RFP-AS-01-AAA.pdf2020-AS-01


번호
추가

RFP-AS-02-BBB.pdf2020-AS-02
RFP-CW-01-CCC.pdf2020-CW-01
RFP-CW-02-DDD.pdf2020-CW-02


enscript용 템플릿 추가

% -- code follows this line --
%Format: fmodstr    $D{%a %b %d %H:%M:%S %Y}
%Format: pagenumstr $V$%

%HeaderHeight: 38
%FooterHeight: 15

/do_header {   % print default simple header

  % Footer
  gsave
    d_footer_x d_footer_y HFpt_h 3 div add translate
    HF setfont

    user_footer_p {
      d_footer_x  d_footer_y moveto user_footer_left_str show

      d_footer_w user_footer_center_str stringwidth pop sub 2 div
      0 moveto user_footer_center_str show

      d_footer_x d_footer_w add user_footer_right_str stringwidth pop sub
      d_footer_y moveto user_footer_right_str show
    } if
  grestore

  % Header
  gsave
    d_header_x d_header_y HFpt_h 3 div add translate
    HF setfont

    user_header_p {
      5 0 moveto user_header_left_str show

      d_header_w user_header_center_str stringwidth pop sub 2 div
      0 moveto user_header_center_str show

      d_header_w user_header_right_str stringwidth pop sub 5 sub
      0 moveto user_header_right_str show
    } {
      5 0 moveto fname show
      45 0 rmoveto fmodstr show
      45 0 rmoveto pagenumstr show
    } ifelse
  grestore

} def

스크립트 준비

INPUT=$1
HEADER=$2
 
echo IN  : $INPUT
echo OUT : $HEADER.pdf

number_of_pages=$(pdftk $INPUT dump_data | grep NumberOfPages | sed 's/NumberOfPages: //g')

if [ $(($number_of_pages % 2)) -eq 1 ]; then
	pdftk $INPUT a4.pdf cat output tmp.pdf
	number_of_pages=$(($number_of_pages+1))
else
	pdftk $INPUT output tmp.pdf 
fi
 
echo | \
enscript -F Times-Roman20 --fancy-header=footer -L1 -b"|$HEADER|" --footer '||' -o- | \
ps2pdfwr - > stamp.pdf

pdftk tmp.pdf stamp stamp.pdf output "stamp-$INPUT"
 
#rm tmp.pdf stamp.pdf


INPUT=$1
OUTPUT=$(echo $1 | sed 's/.pdf$//g')-numbered.pdf
 
echo IN  : $INPUT
echo OUT : $OUTPUT
 
number_of_pages=$(pdftk $IN dump_data | grep NumberOfPages | sed 's/NumberOfPages: //g')
 
(for i in $(seq $number_of_pages); do echo; done) | \
enscript -F Times-Roman12 --fancy-header=footer -L1 -b"||" --footer '|$%|' -o- | \
ps2pdf - > stamp.pdf

pdftk $IN multistamp stamp.pdf output $OUTPUT
 
#rm stamp.pdf  


스크립트 실행

$ ./add-header.sh RFP-AS-01-AAA.pdf "2020-AS-01"
OUT : 2020-AS-01.pdf

$ ./add-header.sh RFP-AS-02-BBB.pdf "2020-AS-02"
OUT : 2020-AS-02.pdf

$ ./add-header.sh RFP-CW-01-CCC.pdf "2020-CW-01"
OUT : 2020-CW-01.pdf

$ ./add-header.sh RFP-AS-02-DDD.pdf "2020-CW-02"
OUT : 2020-CW-02.pdf

$ pdftk `ls 2020-AS-*.pdf |sort` cat output RFP-AS.pdf
$ pdftk `ls 2020-CW-*.pdf |sort` cat output RFP-AS.pdf
$ pdftk RFP-AS.pdf RFP-CW.pdf cat output RFP.pdf

$ ./add-pagenum.sh RFP.pdf
OUT : RFP-numbered.pdf


참고

https://anaraven.bitbucket.io/blog/2018/numbering-pages-of-a-pdf.html

https://www.maketecheasier.com/combine-multiple-pdf-files-with-pdftk/