명령줄을 사용하여 각 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

세 번째 단계: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여러 페이지를 분할할 위치에 대한 정보가 있는 경우 파일을 수동으로 편집할 수 있습니다.

세 번째 단계:이제 다양한 페이지 크기와 분할을 위한 다양한 소수점 위치(편집한 경우)를 사용하여 왼쪽 분할 페이지와 오른쪽 분할 페이지를 만듭니다.

#!/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

네 번째 단계:이는 이전의 간단한 예와 동일한 병합 단계입니다.

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

답변2

아래와 같이 PDF를 PostScript로 변환하여 도구 선택을 확장한 다음 다음을 사용할 수 있습니다.정지 시간. 두 페이지를 표시하는 A4 세로 페이지로 시작한다고 가정합니다. 이는 아마도 다음과 같이 등뼈가 가운데를 가로질러 수평으로 이어지는 열린 책에서 스캔되었을 것이기 때문입니다.

원래

분명히 특정 상황에 맞게 아래 솔루션의 값을 변경할 수 있습니다.

pdf2ps.ghostscript(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

관련 정보