명령줄을 사용하여 각 PDF 페이지를 두 페이지로 분할하려면 어떻게 해야 합니까?

명령줄을 사용하여 각 PDF 페이지를 두 페이지로 분할하려면 어떻게 해야 합니까?

원본에서 스캔한 전자책이 몇 권 있습니다. 단일 형식으로 구성되어 있습니다.PDF 페이지2개 포함실제 페이지: 왼쪽에 하나, 오른쪽에 하나.

프로그래밍 방식으로 각 PDF 페이지를 두 개로 분할하여 PDF 페이지 1의 왼쪽 50%가 페이지 1이 되고 오른쪽이 페이지 2가 되는 식으로 모든 페이지에 대해 그렇게 하고 싶습니다.

이 문제에 도움이 될 수 있는 명령줄 유틸리티나 스크립트를 아는 사람이 있나요?


출력 pdfimages -list -f 1 -l 1 file.pdf:

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    1921  1561  rgb     3   8  jpeg   no       643  0   200   200  200K 2.3%
   1     1 stencil     1     1  -       1   1  image  no   [inline]   0.692     2    -    - 
   1     2 stencil     1     1  -       1   1  image  no   [inline]   0.722 0.650    -    - 
   1     3 stencil     1     1  -       1   1  image  no   [inline]       3     3    -    - 

두 번째 PDF:

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     456   625  gray    1   8  jpx    yes      251  0    72    72 11.7K 4.2%

답변1

이렇게 하려면 pdftk도구(및 ghostscript)가 필요합니다.

간단한 사례:

1단계:개별 페이지로 분할

 pdftk clpdf.pdf burst

pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf이렇게 하면 각 페이지마다 하나씩 파일이 생성됩니다 . 또한 doc_data.txt페이지 차원을 포함하는 제품 도 생성됩니다 .

2단계:왼쪽 및 오른쪽 절반 페이지 만들기

  pw=`cat doc_data.txt  | grep PageMediaDimensions | head -1 | awk '{print $2}'`
  ph=`cat doc_data.txt  | grep PageMediaDimensions | head -1 | awk '{print $3}'`
  w2=$(( pw / 2 ))
  w2px=$(( w2*10 ))
  hpx=$((  ph*10 ))
  for f in  pg_[0-9]*.pdf ; do
   lf=left_$f
   rf=right_$f
   gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
   gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${w2} 0]>> setpagedevice" -f ${f}
  done

3단계:newfile.pdf단일 페이지 .pdf를 포함 하도록 생성하려면 왼쪽과 오른쪽을 병합합니다 .

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

보다 일반적인 경우:

  1. 위의 예에서는 모든 페이지의 크기가 동일하다고 가정합니다. 파일 doc_data.txt에는 각 분할 페이지의 크기가 포함되어 있습니다. 명령이

    grep PageMediaDimensions <doc_data.txt | sort | uniq | wc -l

    1을 반환하지 않으면 페이지의 크기가 다르며 추가 논리가 필요합니다.2단계.

  2. 분할이 정확히 50:50이 아닌 경우 w2=$(( pw / 2 ))위 예에서 사용된 것보다 더 나은 공식이 필요합니다.

이 두 번째 예는 보다 일반적인 경우를 처리하는 방법을 보여줍니다.

1단계:pdftk이전 과 같이 분할

2단계:이제 각 페이지의 너비와 높이와 왼쪽 페이지에서 사용할 분할 부분에 대한 기본값을 포함하는 세 개의 파일을 만듭니다.

  grep PageMediaDimensions <doc_data.txt | awk '{print $2}'    >   pws.txt
  grep PageMediaDimensions <doc_data.txt | awk '{print $3}'    > phs.txt
  grep PageMediaDimensions <doc_data.txt | awk '{print "0.5"}' > lfrac.txt

lfrac.txt다른 페이지를 분할할 위치에 대한 정보가 있는 경우 파일을 직접 편집할 수 있습니다.

3단계:이제 다양한 페이지 크기와 분할을 위한 다양한 부분 위치(편집된 경우)를 사용하여 왼쪽 및 오른쪽 분할 페이지를 만듭니다.

#!/bin/bash
exec 3<pws.txt
exec 4<phs.txt
exec 5<lfrac.txt

for f in  pg_[0-9]*.pdf ; do
 read <&3 pwloc
 read <&4 phloc
 read <&5 lfr
 wl=`echo "($lfr)"'*'"$pwloc" | bc -l`;wl=`printf "%0.f" $wl`
 wr=$(( pwloc - wl ))
 lf=left_$f
 rf=right_$f
 hpx=$((  phloc*10 ))
 w2px=$(( wl*10 ))
 gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
 w2px=$(( wr*10 ))
 gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${wl} 0]>> setpagedevice" -f ${f}
done

4단계:이는 이전의 더 간단한 예와 동일한 병합 단계입니다.

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

답변2

다음과 같이 PDF를 PostScript로 변환한 다음 다음을 사용하여 도구 선택의 폭을 넓힐 수 있습니다.pstop. 나는 다음과 같이 책등이 가운데를 가로로 통과하면서 펼쳐진 책에서 스캔했을 수 있는 두 페이지를 표시하는 A4 세로 페이지에서 시작한다고 가정했습니다.

원래의

분명히 아래 솔루션의 값을 정확한 사례에 맞게 변경할 수 있습니다.

pdf2ps(ghostscript 패키지의 일부인)을 사용하여 이 PDF를 PostScript로 변환할 수 있습니다 . 그런 다음 psutils 패키지의 도구를 pstops사용하여 왼쪽 하단 모서리를 기준으로 페이지를 오른쪽(시계 방향)으로 회전하고 크기를 조정한 다음 결과를 위로 이동하여 아래쪽 절반만 전체 페이지를 덮을 수 있습니다.

한 페이지

동일한 원본 페이지에서 유사한 회전, 크기 조정 및 변환을 통해 두 번째 페이지를 만들 수 있습니다. 결과는 다시 PDF로 변환될 수 있습니다. 단일 명령으로 각 페이지를 2개의 새 페이지에 그릴 수 있습니다.

pdf2ps myfile.pdf out.ps
pstops -p a4 '[email protected](1cm,29cm),[email protected](-16cm,29cm)' out.ps new.ps
ps2pdf new.ps new.pdf

구문은 매뉴얼 페이지에 설명되어 있습니다. 여기에서는 R오른쪽으로 회전하고, @1.2로 크기를 조정하고, (x,y)로 결과를 이동합니다. 쉼표(,)는 각 원본 페이지에서 2페이지를 생성합니다.

매번 페이지의 절반만 보더라도 각 페이지가 완전히 두 번 그려지기 때문에 이렇게 하면 결과 PDF의 크기가 두 배가 됩니다.

답변3

당신은 특히 명령줄에 대한 솔루션을 요청합니다. 아마도 앉아서 모든 페이지를 선택하고 싶지 않기 때문일 것입니다.

그러나 모든 책을 열어도 괜찮다면 pdfarranger괜찮을 것입니다.

PDF 파일 크기가 두 배로 늘어나지는 않습니다.

나누기 전 분할 후

답변4

당신은보고 싶을 수도 있습니다 imagemagick:

$ convert -resize 1000x1000 /links/www/Salix/pdf/index.pdf a.jpg
$ convert -crop 500x1000+0+0  a.jpg b.jpg
$ convert -crop 500x1000+500+0 a.jpg c.jpg
$ convert c.jpg c.pdf
$ convert b.jpg b.pdf

관련 정보