DjVu 문서 · 7 min read · Feb 07, 2026
DjVu 문서 만들기 리눅스 HOWTO
버전 0.2 (2006년 7월 12일)
1 개요
이 문서는 리눅스에서 품질 좋은 DjVu 문서를 만들기 위한 djvulibre 구현의 사용법을 설명합니다. DjVu 형식은 비트맵 문서 압축 및 하이퍼텍스트 구조를 특징으로 합니다. 이는 전 세계의 수많은 웹사이트에서 스캔한 문서 및 고해상도 사진을 포함한 디지털 문서를 저장하고 배포하는 데 사용됩니다. DjVu 파일의 장점 중 하나는 특히 작은 크기이며, 종종 동일한 내용을 가진 PDF 또는 JPEG 파일보다 작습니다. 이는 DjVu가 책과 저널, 특히 과학 저널을 디지털화하는 데 유용한 도구가 되게 합니다.
아래에서는 각 페이지가 단일 JPEG 파일로 구성된 DjVu 문서를 만드는 경우를 고려합니다. 여기서 JPEG 형식은 제한이 아니며, 예제는 임의의 이미지 형식을 포함할 수 있습니다. PDF에서 DjVu로의 변환도 논의됩니다. 스캐너 소프트웨어의 사용법은 설명되지 않으니 관련 문서를 참조하십시오.
요구 사항. 패키지 djvulibre, jpeg 및 netpbm이 필요합니다. 패키지 sane 및 xpdf는 강력히 권장됩니다.
2 DjVu 만들기
2.1 책 스캔하기
이 섹션의 상황을 가정해 보겠습니다. 우리는 스캔하여 디지털 형식으로 저장해야 하는 책이 있습니다. 단순화를 위해 책 내용이 흑백(텍스트, 수식, 도표 등)이고 책 표지는 색상으로 인쇄되어 있다고 가정합니다. 우리가 일반적으로 할 수 있는 것은 페이지별로 스캔하고 페이지를 JPEG 또는 PDF와 같은 이미지 형식으로 별도로 저장하는 것입니다. 개인적으로 JPEG가 최선의 선택이라고 생각합니다. 그러나 예를 들어 압축된 TIFF가 더 적합하다고 판단되면 이 HOWTO가 도움이 될 수 있습니다. 그러나 이 경우 예제 스크립트는 약간 수정되어야 합니다. 당분간은 JPEG에 집중하겠습니다.
책의 경우 책 앞표지(그리고 뒷표지에도 눈에 띄는 텍스트나 그림이 있다면) 색상 JPEG 파일로 스캔합니다. 그런 다음 나머지는 흑백 JPEG로 스캔합니다. 이는 최적의 성능을 제공해야 합니다. 스캔한 이미지를 저장할 때 파일 이름에 주의하십시오. DjVu로의 변환을 위해 모든 이미지는 페이지 순서를 존중하여 알파벳순으로 정렬되어야 합니다. 예를 들어,
000.jpg, 001.jpg, 002.jpg, …, 012.jpg
는 올바른 번호 매기기이며;
0.jpg, 1.jpg, 2.jpg, …, 12.jpg
는 잘못된 번호 매기기입니다. 왜냐하면 12.jpg가 2.jpg보다 먼저 나타나기 때문입니다. 전체 책이 스캔되면 모든 이미지 파일을 별도의 디렉토리에 배치하십시오.
스캐너 장치, 소프트웨어 및 스캔 방법에 따라 모든 JPEG 이미지를 회전해야 할 수도 있으며, 일반적으로 간단한 패턴을 따릅니다. 아래의 jpegsrotate 스크립트가 이러한 경우에 유용할 수 있습니다. 예를 들어, 현재 디렉토리에서 짝수 페이지를 거꾸로 돌리려면 –even 매개변수로 실행하십시오. 스크립트에서 사용되는 jpegtran 프로그램은 JPEG를 시계 방향으로 90, 180 또는 270도만 회전할 수 있습니다.
#!/bin/bash
#
# jpegsrotate
#
if [ -z `which jpegtran` ]; then
usage
echo "오류: jpegtran이 필요합니다"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270
function usage() {
echo
echo "사용법:"
echo "$0"
echo " 마스크 $DEFMASK로 $DEFDEG도 시계 방향으로 회전합니다"
echo "$0 --even"
echo " 마스크 $DEFEVENMASK로 짝수 파일을 180도 회전합니다"
echo "$0 --odd"
echo " 마스크 $DEFODDMASK로 홀수 파일을 180도 회전합니다"
echo "$0 --params \"REGEXP\" (90|180|270)"
echo " 주어진 비율로 시계 방향으로 REGEXP 마스크의 파일을 회전합니다"
echo
}
if [ "$1" == "--even" ]; then
MASK=$DEFEVENMASK
DEG=180
elif [ "$1" == "--odd" ]; then
MASK=$DEFODDMASK
DEG=180
elif [ "$1" == "--params" ]; then
if [ -n "$2" -a -n "$3" ]; then
MASK=$2
DEG=$3
else
usage
exit 1
fi
elif [ -n "$1" ]; then
usage
exit 1
else
MASK=$DEFMASK
DEG=$DEFDEG
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "오류: 현재 디렉토리에는 마스크 $MASK의 파일이 있어야 합니다"
echo
exit 1
fi
echo "$i"
jpegtran -rotate $DEG $i > $i.rotated
mv $i.rotated $i
done
2.2 JPEG를 비트온얼 DjVu로 변환하기
이미지가 준비되면 각 이미지를 DjVu 형식의 별도 페이지로 변환해야 하며, cjb2 또는 cpaldjvu와 같은 DjVu 인코더를 사용하여 별도의 페이지를 단일 DjVu 문서로 묶어야 합니다. 다음 스크립트를 ~/bin/에 any2djvu-bw라는 이름으로 작성하십시오. 소스 이미지가 포함된 디렉토리에서 스크립트를 실행하여 별도의 흑백 페이지로 변환합니다.
#!/bin/bash
#
# any2djvu-bw
#
if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "오류: anytopnm, ppmtopgm, pgmtopbm 및 cjb2가 필요합니다"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
# 다음 줄의 주석을 제거하여 번들된 DjVu 문서를 컴파일합니다
#OUTFILE="#0-bw.djvu"
function usage() {
echo
echo "사용법:"
echo
echo "$0 [\"REGEXP\"]"
echo " 현재 디렉토리에서 단일 페이지를 기본 마스크 $DEFMASK (또는 제공된 REGEXP)로 변환합니다"
# 다음 줄의 주석을 제거하여 번들된 DjVu 문서를 컴파일합니다
# echo " 그리고 이를 djvu 파일 $OUTFILE로 묶습니다"
echo
}
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "오류: 현재 디렉토리에는 마스크 $MASK의 파일이 있어야 합니다"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# netpbm >= 10.23에서는 위의 줄을 다음으로 대체할 수 있습니다:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done
# 다음 줄의 주석을 제거하여 번들된 DjVu 문서를 컴파일합니다
#djvm -c $OUTFILE $MASK.djvu
스크립트를 다음과 같이 실행하면
$ ~/bin/any2djvu-bw기본 동작을 수행하고 현재 디렉토리의 모든 이미지 *.jpg를 단일 페이지 DjVu 파일로 변환하려고 시도합니다. 파일 마스크를 정의하여 이 동작을 변경할 수 있습니다(선택적 매개변수). dithering 값 0.499는 실험적으로 얻은 값으로 비트온얼 이미지에 대해 매우 좋은(최고의) 설정을 나타냅니다. 또한 any2djvu-bw에서 최종 번들 흑백 DjVu 문서를 스크립트의 단일 실행으로 컴파일하려면 표시된 줄의 주석을 제거할 수 있습니다. 그렇게 했다면 색상 페이지가 필요 없다면 색상 이미지 변환에 대한 다음 하위 섹션을 건너뛸 수 있습니다.
2.3 JPEG를 저색상 DjVu로 변환하기
다음으로, 앞뒤 표지에서 가져온 색상 이미지를 변환해야 합니다. 앞표지가 000.jpg에 저장되고 뒷표지가 999.jpg에 저장되며, 각 파일에는 최대 8톤이 포함되어 있다고 가정합니다. 이전 any2djvu-bw 실행 후 두 개의 원치 않는 DjVu 파일, 즉 흑백 버전 000.jpg.djvu 및 999.jpg.djvu가 남았습니다. 이 두 파일을 삭제하십시오. 그런 다음 다음 명령을 실행하여 000.jpg와 999.jpg를 색상 DjVu 페이지로 변환합니다(따옴표가 필요합니다):
$ ~/bin/any2djvu-low "+(000|999).jpg" 8여기서 any2djvu-low는 아래에 제공된 스크립트로, 이 명령을 실행하기 위해 ~/bin/에 작성해야 합니다.
#!/bin/bash
#
# any2djvu-low
#
if [ -z `which cpaldjvu` ]; then
usage
echo "오류: cpaldjvu가 필요합니다"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# 다음 줄의 주석을 제거하여 번들된 DjVu 문서를 컴파일합니다
#OUTFILE="#0-low.djvu"
function usage() {
echo
echo "사용법:"
echo
echo "$0 [\"REGEXP\" [INT]]"
echo " 현재 디렉토리에서 단일 페이지를 기본 마스크 $DEFMASK (또는 제공된 REGEXP)로 변환합니다"
echo " 색상 수는 $DEFNCOLORS (기본값) 또는 제공된 INT입니다"
# 다음 줄의 주석을 제거하여 번들된 DjVu 문서를 컴파일합니다
# echo " 그리고 이를 djvu 파일 $OUTFILE로 묶습니다"
echo
}
if [ -n "$1" ]; then
MASK=$1
if [ -n "$2" ]; then
NCOLORS=$2
else
NCOLORS=$DEFNCOLORS
fi
else
MASK=$DEFMASK
NCOLORS=$DEFNCOLORS
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "오류: 현재 디렉토리에는 마스크 $MASK의 파일이 있어야 합니다"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
fi
done
# 다음 줄의 주석을 제거하여 번들된 DjVu 문서를 컴파일합니다
#djvm -c $OUTFILE $MASK.djvu
저색상 DjVu 페이지는 비트온얼 인코더 cjb2가 아닌 저색상 인코더 cpaldjvu에 의해 생성되었습니다. 때때로 cpaldjvu의 2색 설정은 cjb2의 출력 파일보다 약간 더 작은 출력 파일을 생성할 수 있습니다. 이는 cpaldjvu의 경우 검은색이 더 밝게 나타나기 때문입니다. 따라서 비트온얼 이미지의 경우 cjb2의 사용이 바람직합니다. 일반적으로 검은색이 더 밝을수록 더 보기 좋습니다. 또한, JPEG 이미지를 cpaldjvu를 사용하여 비트온얼 DjVu로 변환하는 데는 cjb2를 사용할 때보다 약 1.5배 더 오랜 시간이 걸립니다.
cpaldjvu(기본 색상 수 256)가 초기 JPEG 파일(16M 색상)과 거의 동일한 크기의 출력을 생성할 것으로 예상할 수도 있습니다. cpaldjvu의 -colors n 옵션을 사용하여 색상 수를 줄이면 많은 경우 문제가 기하급수적으로 느려지며, 예를 들어 n을 256에서 16으로 줄이면 출력이 4배 작아질 수 있습니다.
2.4 DjVu 결합하기
마지막 단계는 모든 개별 DjVu 페이지를 다중 페이지 DjVu 문서로 결합하는 것입니다. 다음 스크립트 binddjvu가 이 작업을 수행합니다.
#!/bin/bash
#
# binddjvu
#
shopt -s extglob
OUTFILE="#0.djvu"
DEFMASK="*.jpg.djvu"
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
djvm -c $OUTFILE $MASK
다중 페이지 DjVu 파일 #0.djvu에 더 나은 의미 있는 이름을 부여할 수 있습니다:
$ mv #0.djvu thebook.djvu이로써 예제가 완료되었습니다.
2.5 PDF를 DjVu로 변환하기
PDF 형식은 jstor.org와 같은 문서를 디지털화하는 데에도 사용되며, 현재는 많은 사람들이 PDF를 읽기 위한 프로그램을 가지고 있지만 DjVu를 읽기 위한 프로그램은 없는 이유로 여전히 DjVu보다 널리 퍼져 있습니다. PDF를 DjVu로 교체해야 하는 몇 가지 이유가 있습니다. 그 중 일부는 다음과 같습니다:
- 스캔한 문서에서 DjVu의 성능이 PDF보다 확실히 우수합니다. 따라서 스캔한 PDF 문서를 DjVu 형식으로 변환하는 것이 의미가 있습니다.
- 여러 개의 (단일 페이지) PDF 문서를 함께 결합해야 하는 또 다른 상황이 있습니다. 예를 들어, 인터넷 도서관에서 다운로드한 PDF 문서의 페이지를 가져옵니다.
- 단일 페이지 또는 다중 페이지 PDF를 단일 DjVu로 병합합니다.
- 일부 스캐너에서는 단일 페이지 PDF 파일로 직접 스캔할 수 있습니다. 그러면 PDF를 다중 페이지 DjVu로 결합하는 것이 편리합니다.
다음 스크립트 pdfs2djvu는 위의 각 작업을 수행하는 데 충분합니다. 기본적으로 pdfs2djvu는 현재 디렉토리의 모든 *.pdf 파일을 알파벳 순서로 가져와 단일 다중 페이지 비트온얼 DjVu 파일 #0.djvu를 생성합니다.
#!/bin/bash
#
# pdfs2djvu
#
if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "오류: pdftoppm, cjb2 및 djvm이 필요합니다"
echo
exit 1
fi
shopt -s extglob
OUTFILE="#0.djvu"
DEFMASK="*.pdf"
DPI=600
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for PDF in $MASK; do
if [ ! -e $PDF ]; then
echo
echo "오류: 현재 디렉토리에는 마스크 $MASK의 파일이 있어야 합니다"
echo
exit 1
fi
echo $PDF
pdftoppm -mono -r 600 -aa yes $PDF $PDF
for PBM in $PDF*.pbm; do
echo $PBM
cjb2 -dpi $DPI $PBM $PBM.djvu
rm -f $PBM
done
done
djvm -c $OUTFILE $MASK*.pbm.djvu
스크립트를 실행한 후 pdfs2djvu는 현재 디렉토리에 *.pbm.djvu 파일로 DjVu 인코딩된 페이지를 남깁니다.
3 결론
이 HOWTO는 DjVu의 개발자가 아닌 사용자가 작성했습니다. 따라서 HOWTO에는 일부 기술 세부사항이 부족할 수 있습니다. 명령에 대한 더 많은 기술 정보를 원하시면 매뉴얼 페이지나 기타 관련 문서를 참조하십시오. 리눅스에서 djvulibre를 사용하기 시작하는 모든 분에게 매우 유익한
$ man djvu를 추천합니다.
저자: 블라디미르 코멘단츠키
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.