원본에서 스캔한 전자책이 여러 권 있습니다. 단일 형식으로 구성됩니다.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
보다 일반적인 경우:
위의 예에서는 모든 페이지의 크기가 동일하다고 가정합니다. 이
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
여러 페이지를 분할할 위치에 대한 정보가 있는 경우 파일을 수동으로 편집할 수 있습니다.
세 번째 단계:이제 다양한 페이지 크기와 분할을 위한 다양한 소수점 위치(편집한 경우)를 사용하여 왼쪽 분할 페이지와 오른쪽 분할 페이지를 만듭니다.
#!/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
답변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