Хорошо, и хорошо весьма!!!
Добавьте, пожалуйста, в документацию, что номера страниц, соответствующие tif-ам, определяются путём сортировки (т. е. имена самих файлов могут быть любыми).
По поводу внедрения закладок с помощью djvutools я выложу свой обработчик (Excel-евский макрос, полученный дедукцией и методом научного тыка из исходника Ging

), может быть, поможет. Русские буквы он вставляет нормально.
Добавлено: Так, вот он:
[more]
Sub bookmarks_djvused()
'Written 28 November 2008 by Melirius
'I love Ru-board
fileSaveName = ActiveWorkbook.Path & "\bookmarks.txt"
If fileSaveName = False Then GoTo out
Open fileSaveName For Output As #1
Range("a1", Range("a1").End(xlDown)).Select
n_of_rows = Selection.Rows.Count
Print #1, "(bookmarks"; Chr(10)
Dim Buffer() As Byte
For i = 1 To n_of_rows
ActiveSheet.Rows(i).Select
bmk_level = Selection.Cells(1, 1).Value
bmk_title = Selection.Cells(1, 2).Value
temp = ""
' Convert string to the unusual required form
For j = 1 To Len(bmk_title)
Buffer = Mid(bmk_title, j, 1)
If (Buffer(0) = 167) And (Buffer(1) = 0) Then
temp = temp & "\302\247"
Else
If (Buffer(0) = 20) And (Buffer(1) = 32) Then
temp = temp & "-"
Else
If (Buffer(0) = 34) And (Buffer(1) = 0) Then
temp = temp & "\" & Chr(34)
Else
If (Buffer(0) = 92) And (Buffer(1) = 0) Then
temp = temp & "\\"
Else
If (Buffer(1) = 0) Then
temp = temp & Chr(Buffer(0))
Else
tmp = DecToOct(Buffer(0))
aga = Int((tmp + 200) / 300)
temp = temp & "\" & DecToOct(Buffer(1)) + 316 + aga & "\" & tmp + 200 - (100 * aga)
End If
End If
End If
End If
End If
Next j
bmk_page = Selection.Cells(1, 3).Value
ActiveSheet.Rows(i + 1).Select
next_bmk_level = Selection.Cells(1, 1).Value
If next_bmk_level > bmk_level Then
Print #1, "("; Chr(34); temp; Chr(34); Chr(10); Chr(34); "# "; bmk_page & Chr(34); Chr(10)
End If
If next_bmk_level = bmk_level Then
Print #1, "("; Chr(34); temp; Chr(34); Chr(10); Chr(34); "# "; bmk_page & Chr(34); " )"; Chr(10)
End If
If next_bmk_level < bmk_level Then
tmp_str = ""
For t = 1 To (bmk_level - next_bmk_level)
tmp_str = tmp_str + " )"
Next t
Print #1, "("; Chr(34); temp; Chr(34); Chr(10); Chr(34); "# "; bmk_page & Chr(34); " )"; tmp_str; Chr(10)
End If
Next i
Print #1, ")"; Chr(10)
Close #1
out:
End Sub
[/more]
Смысл исходника такой: есть таблица Excel из 3 столбцов, в первом - уровень заголовка, во втором - название, в третьем - страница. Макрос печатает файл bookmarks.txt, который вставляется в djvu командой
djvused.exe -e "set-outline bookmarks.txt" "имя_файла.djvu" -s
Некоторые символы, в частности, русские буквы, приходится переправлять в какие-то восьмеричные коды. Это делает часть макроса от строки ' Convert string to the unusual required form и далее.
И не спрашивайте, как я получил выражение для последнего else, которое и обрабатывает русские буквы - не расскажу, ибо не помню

.