
원본에서 스캔한 전자책이 몇 권 있습니다. 단일 형식으로 구성되어 있습니다.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
보다 일반적인 경우:
위의 예에서는 모든 페이지의 크기가 동일하다고 가정합니다. 파일
doc_data.txt
에는 각 분할 페이지의 크기가 포함되어 있습니다. 명령이grep PageMediaDimensions <doc_data.txt | sort | uniq | wc -l
1을 반환하지 않으면 페이지의 크기가 다르며 추가 논리가 필요합니다.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
답변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