건너뛰기 페이지가 포함된 스크립트

건너뛰기 페이지가 포함된 스크립트

나는 djvu 책의 스캔 버전을 가지고 있습니다. 두 가지 상황을 고려해 보겠습니다.

  1. 페이지 번호를 매기고 싶습니다. 0, 1, 2, ...(사용 사례: 표지는 0페이지여야 합니다.)

  2. 일부 페이지에는 로마 숫자로 번호를 매기고 일부 페이지에는 아라비아 숫자로 번호를 매기고 싶습니다. 예를 들어 다음과 같습니다. ( 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"
...

djvusedDjVu 파일에 대한 변경 사항을 커밋 하려면 스크립트의 출력을 파이프해야 합니다 .

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"
...

djvusedDjVu 파일에 대한 변경 사항을 커밋 하려면 다음 목록을 전달하세요 .

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

관련 정보