나는 djvu 책의 스캔 버전을 가지고 있습니다. 두 가지 상황을 고려해 보겠습니다.
페이지 번호를 매기고 싶습니다.
0, 1, 2, ...
(사용 사례: 표지는 0페이지여야 합니다.)일부 페이지에는 로마 숫자로 번호를 매기고 일부 페이지에는 아라비아 숫자로 번호를 매기고 싶습니다. 예를 들어 다음과 같습니다. (
i, ii, iii, ..., x, 1, 2, 3, ...
사용 사례: 책의 일부 소개 페이지에는 로마 숫자로 번호가 매겨져 있습니다.)
Linux에서 구현이 가능한가요?
답변1
가능하지만 요청해야 하는 경우에는 그다지 유용하지 않을 것입니다. set-page-title
다음과 같은 일련의 명령을 생성하려면 스크립트가 필요합니다 .
select 1; set-page-title "Cover"
select 2; set-page-title "i"
select 3; set-page-title "ii"
select 4; set-page-title "iii"
select 5; set-page-title "1"
select 6; set-page-title "2"
select 7; set-page-title "3"
select 8; set-page-title "4"
select 9; set-page-title "5"
select 10; set-page-title "6"
...
djvused
DjVu 파일에 대한 변경 사항을 커밋 하려면 스크립트의 출력을 파이프해야 합니다 .
djvu_pagination | djvused -f - -s file.djvu
그러나 기회는 단 한 번만 주어집니다. 번호가 잘못된 경우 동일한 명령을 다시 실행할 수 없으며 구성 요소 이름을 참조하여 논리적 페이지 번호를 재설정해야 합니다. 문제는 다음과 같습니다.
select "all_24223_to_00243.cpc.djvu"; set-page-title "all_24223_to_00243.cpc.djvu"
select "all_24223_to_00243.cpc0002.djvu"; set-page-title "all_24223_to_00243.cpc0002.djvu"
select "all_24223_to_00243.cpc0003.djvu"; set-page-title "all_24223_to_00243.cpc0003.djvu"
select "all_24223_to_00243.cpc0004.djvu"; set-page-title "all_24223_to_00243.cpc0004.djvu"
select "all_24223_to_00243.cpc0005.djvu"; set-page-title "all_24223_to_00243.cpc0005.djvu"
...
djvused
그런 다음 이러한 명령을 위와 같이 파이프할 수 있습니다 .
djvu_reset_pagination | djvused -f - -s file.djvu
옛날 옛적에 사람들은 이 모든 일을 처리하기 위해 스크립트를 사용했습니다. 그런 시절은 이제 지나갔습니다.
답변2
2021년 3월 업데이트: 스크립트 업데이트 + 페이지 건너뛰기
(lcd047의 답변에서 수정)
문제가 발생할 경우를 대비해 .djvu 파일의 백업 복사본을 만듭니다.
numconv
설치 패키지에서여기.
다음을 텍스트 파일로 저장합니다. 예 generate_page_list.sh
:
#!/bin/bash
## Set these parameters:
# Name first/last page $CNAME/$BCNAME? (Yes/No=0/1)
COVER=1
BCOVER=0
CNAME="C"
BCNAME="BC"
# Lowest roman page number
MINROMAN=3
# Highest roman page number
MAXROMAN=6
# Lowest arabic page number
MINARABIC=1
# Highest arabic page number
MAXARABIC=10
# Create/Empty new_page_list
> new_page_list
# Initialise total page number iTOTAL
iTOTAL=1
# Generate list of set-page-title commands
if [[ "$COVER" == 1 ]]; then
echo "select $iTOTAL; set-page-title \"$CNAME\"" >> new_page_list
((iTOTAL++))
fi
for (( i=$MINROMAN; i<=$MAXROMAN; i++)); do
iROMAN=`echo $i | numconv -f Western -t Roman_Lower`
echo "select $iTOTAL; set-page-title \"$iROMAN\"" >> new_page_list
((iTOTAL++))
done
for (( i=$MINARABIC; i<=$MAXARABIC; i++)); do
echo "select $iTOTAL; set-page-title \"$i\"" >> new_page_list
((iTOTAL++))
done
if [[ "$BCOVER" == 1 ]]; then
echo "select $iTOTAL; set-page-title \"$BCNAME\"" >> new_page_list
((iTOTAL++))
fi
generate_page_list.sh
실행 파일 전달
chmod +x generate_page_list.sh
스크립트를 실행하여
./generate_page_list.sh
그러면 파일이 생성됩니다 new_page_list
. 이 파일을 텍스트 편집기에서 열고 set-page-title
다음과 같은 일련의 명령이 포함되어 있는지 확인하십시오.
select 1; set-page-title "Cover"
select 2; set-page-title "i"
select 3; set-page-title "ii"
select 4; set-page-title "iii"
select 5; set-page-title "1"
select 6; set-page-title "2"
select 7; set-page-title "3"
select 8; set-page-title "4"
select 9; set-page-title "5"
select 10; set-page-title "6"
...
djvused
DjVu 파일에 대한 변경 사항을 커밋 하려면 다음 목록을 전달하세요 .
djvused -f new_page_list -s file.djvu
건너뛰기 페이지가 포함된 스크립트
.djvu 파일에 페이지가 누락된 경우(예: 스캔 시 빈 페이지가 남음) 위 스크립트의 다음 확장자를 사용할 수 있습니다.
#!/bin/bash
## Set these parameters:
# Name first/last page $CNAME/$BCNAME? (Yes/No=0/1)
COVER=1
BCOVER=0
CNAME="C"
BCNAME="BC"
# Lowest roman page number
MINROMAN=3
# Highest roman page number
MAXROMAN=6
# Skipped roman page numbers
SKIPROMAN=""
# Lowest arabic page number
MINARABIC=1
# Highest arabic page number
MAXARABIC=10
# Skipped arabic page numbers
SKIPARABIC="3 5"
# Create/Empty new_page_list
> new_page_list
# Initialise total page number iTOTAL
iTOTAL=1
# Generate list of set-page-title commands
if [[ "$COVER" == 1 ]]; then
echo "select $iTOTAL; set-page-title \"$CNAME\"" >> new_page_list
((iTOTAL++))
fi
for (( i=$MINROMAN; i<=$MAXROMAN; i++)); do
if [[ ! " $SKIPROMAN " =~ " $i " ]]; then
iROMAN=`echo $i | numconv -f Western -t Roman_Lower`
echo "select $iTOTAL; set-page-title \"$iROMAN\"" >> new_page_list
((iTOTAL++))
fi
done
for (( i=$MINARABIC; i<=$MAXARABIC; i++)); do
if [[ ! " $SKIPARABIC " =~ " $i " ]]; then
echo "select $iTOTAL; set-page-title \"$i\"" >> new_page_list
((iTOTAL++))
fi
done
if [[ "$BCOVER" == 1 ]]; then
echo "select $iTOTAL; set-page-title \"$BCNAME\"" >> new_page_list
((iTOTAL++))
fi
SKIPARABIC(또는 SKIPROMAN)은 건너뛸 페이지 번호의 공백으로 구분된 목록이 포함된 문자열입니다. 예를 들어 숫자를 개별적으로 입력할 수 있습니다.
SKIPARABIC="3 4"
또는 범위로
SKIPARABIC="{3..5}"
또는 하나 이상의 숫자와 범위의 조합(또한 공백으로 구분됨)
SKIPARABIC="{3..5} 7 {9..15}"
나는 문자열 비교를 사용하고 있습니다.이 stackoverflow 답변), 이것은 가장 효율적이지는 않을 수 있지만 목록을 기반으로 하는 루프에서 반복을 건너뛰는 데 대해 찾을 수 있는 가장 간단하고 읽기 쉬운 솔루션입니다.
답변3
2023년 11월 업데이트: hife의 답변은 다음에 의존하지 않습니다.numconv
이것hife가 답변함numconv
이 페이지는 아라비아 숫자를 로마 숫자로 변환하는 패키지를 사용합니다 . 그러나 numconv
쿠분투 시스템에 설치하는 데 문제가 있습니다. 즉, 잘 설치되는 것처럼 보이지만 호출하면 오류를 반환합니다 numconv: error while loading shared libraries: libuninum.so.5: cannot open shared object file: No such file or directory
(라이브러리가 있어야 할 위치인 에 있음에도 불구하고 /usr/local/lib/
).
따라서 변환을 수행하는 bash 스크립트를 작성했습니다. 이는 arabic_to_roman
기본적으로 제안된 알고리즘을 bash 음역한 것입니다.여기. 스크립트는 이 글의 마지막 부분에 제공됩니다.
hife 스크립트에서 변경해야 할 유일한 사항은 다음 명령입니다.
iROMAN=`echo $i | numconv -f Western -t Roman_Lower`
이 명령은 다음으로 대체되어야 합니다.
iROMAN=`arabic_to_roman $i`
이것이 작동하려면 스크립트가 arabic_to_roman
검색 경로의 디렉터리에 있어야 합니다. 그렇지 않으면 스크립트에 대한 전체 경로를 제공해야 합니다. 물론 스크립트는 실행 가능해야 합니다(예: 를 사용하여 chmod +x arabic_to_roman
).
마지막으로 스크립트는 다음과 같습니다 arabic_to_roman
.
#!/bin/bash
# sample usage:
# arabic_to_roman 54
# returns liv
# Function to convert Arabic number to Roman numeral
convert_to_roman() {
num=$1
res=""
while [ $num -ge 1000 ]; do
res+="m"
((num-=1000))
done
while [ $num -ge 900 ]; do
res+="cm"
((num-=900))
done
while [ $num -ge 500 ]; do
res+="d"
((num-=500))
done
while [ $num -ge 400 ]; do
res+="cd"
((num-=400))
done
while [ $num -ge 100 ]; do
res+="c"
((num-=100))
done
while [ $num -ge 90 ]; do
res+="xc"
((num-=90))
done
while [ $num -ge 50 ]; do
res+="l"
((num-=50))
done
while [ $num -ge 40 ]; do
res+="xl"
((num-=40))
done
while [ $num -ge 10 ]; do
res+="x"
((num-=10))
done
while [ $num -ge 9 ]; do
res+="ix"
((num-=9))
done
while [ $num -ge 5 ]; do
res+="v"
((num-=5))
done
while [ $num -ge 4 ]; do
res+="iv"
((num-=4))
done
while [ $num -ge 1 ]; do
res+="i"
((num-=1))
done
echo "$res"
}
# Check if an argument is provided
if [ $# -eq 0 ]; then
echo "Usage: $0 <arabic_number>"
exit 1
fi
# Call the function with the provided Arabic number
convert_to_roman $1