안녕하세요. 저는 mpage를 사용하여 여러 단면 용지를 한 페이지에 쉽게 압축할 수 있습니다. 그러나 양면 용지로 동일한 작업을 수행하는 것이 까다롭다는 것을 알았습니다. 이 경우에는 배지를 인쇄하고 있습니다. 내 입력이 다음과 같다고 가정해 보겠습니다.
Badge01Front.pdf
Badge01Back.pdf
Badge02Front.pdf
Badge02Back.pdf
Badge03Front.pdf
...
여러 배지를 하나의 시트로 결합하여 시트를 배지로 자르면 첫 번째 배지 한쪽에는 Badge01Front가 생기고 다른 한쪽에는 Badge01Back이 생기도록 하려면 어떻게 해야 합니까? (등). 참고로 저는 아마도 PDF 대신 SVG를 사용하고 있을 것입니다. 하지만 변환하기 쉽기 때문에 크게 바뀌지는 않을 것입니다.
나는 이미 썼다기본적으로 이 작업을 수행하는 여러 스크립트, 그러나 복잡하고 취약합니다. 이를 수행하는 깨끗한 방법이 있습니까?
답변1
다음은 체계적인 접근 방식입니다. 이후의 파일 이름이 이전 파일 이름에서 간단히 파생될 수 있다고 가정하는 것부터 시작합니다. 그런 다음 이전 파일 수는 페이지당 페이지 수의 배수로 채워집니다. 저는 nup
동일한 이름의 아주 오래된 프로그램에서 이것을 호출했습니다. Bash를 사용하여 이전의 모든 파일 이름의 색인 배열을 만들고
files
끝에 더미 자리 표시자 파일로 채웁니다. 한 번에 하나의 테이블을 처리합니다. 파일 이름을 배열 nup
로 추출합니다. 모든 파일 이름을 올바른 순서로 포함하는 배열 sheet
에 추가하십시오 . final
더미 파일 이름을 건너뛰고 워크시트 파일 이름을 이후 버전 파일 이름으로 변환합니다.
nup/width
너비는 페이지에 있는 항목 수인 시트당 행 수를 계산합니다 . 각 행에 대해 해당 행에 있는 항목의 시작 및 끝 인덱스를 계산하고 워크시트 복사본에서 역순으로 항목을 업데이트합니다. 결과를 final
배열에 추가합니다.
이렇게 하면 아래 bash 스크립트가 더 명확해집니다. 내 앞 파일은 f01.ps
bc 등으로, 뒤 파일 b01.ps
은 dummy.ps
.
nup=8
width=2
let numrows=nup/width
declare -a files final
files=(f*.ps)
dopad(){
while numfiles=${#files[@]}
let x=numfiles/nup*nup
[ $x != $numfiles ]
do files+=(dummy.ps)
done
}
doallsheets(){
declare -a sheet
let numsheets=numfiles/nup
for sheetnum in $(seq $numsheets)
do let offset=(sheetnum-1)*nup
for i in $(seq $nup)
do sheet+=(${files[$offset+$i-1]})
done
dosheet
unset sheet
done
}
dosheet(){
final+=(${sheet[@]})
convertnames
swaprows
final+=(${sheet[@]})
}
convertnames(){
for i in $(seq $nup)
do if [ ${sheet[$i-1]} != dummy.ps ]
then back=${sheet[$i-1]}
sheet[$i-1]=${back/f/b}
fi
done
}
swaprows(){
declare -a sheetcopy=(${sheet[@]})
for row in $(seq $numrows)
do let start=(row-1)*width
let end=row*width-1
swap
done
}
swap(){
for i in $(seq $width)
do sheet[$start+$i-1]=${sheetcopy[$end-$i+1]}
done
}
dopad
doallsheets
mpage -$nup -k -c -bA4 -l -a -P- -L5 -W40 -H ${final[@]} >out.ps
다음에서 생성된 일부 PostScript 파일을 사용하여 이를 테스트했습니다 enscript
.
create(){
echo "$1" | enscript -fCourier30 -FCourierBold30 -p- | eps2eps - - >"${2?}"
}
startup(){
for i in $(seq -f '%02.0f' 11)
do create "item $i front" f$i.ps
create "item $i back" b$i.ps
done
create "dummy" dummy.ps
}
startup