---------------------------------------------------------------
Максим Бычков (bmn(a)lib.ru)
Date: 24 Oct 2003
---------------------------------------------------------------
Предположим, что вами овладела жажда сделать что-нибудь по-настоящему
великое. Предположим, что для этой цели у вас имеется только компьютер,
сканер, программа распознавания текста, несколько книг и непомерное
самомнение, а войти в историю и там побарахтаться сильно хочется. Тогда все
что вам остается сделать, это взять любимую (желательно хорошую и
интересную, но можно и просто нужную народу или редкую) книгу, проверить,
нет ли ее текста в электронном виде где-нибудь в Интернете и приступить к
работе.
Установка сканера по яркости.
Если материал представлен в виде качественной (высокой, офсетной)
печати шрифтом 10 и более пунктов, то черно-белое сканирование в разрешении
300 точек с ручной установкой яркости дает более чем приемлемые результаты.
Количество ошибок на лист A4 стремится к нулю и колеблется в районе 1-5
неправильно распознанных знаков. Установку яркости можно подобрать опытным
путем, сводя к минимуму помехи в виде рассыпанной по листу "сыпи", но в
основном, яркость на уровне 45-55% обеспечивает хорошее качество
распознавания.
В некоторых случаях резонно увеличить разрешение сканирования до 400
точек на дюйм (сложные или нестандартные шрифты, нечеткая печать).
К сканированию с разрешением 600 точек на дюйм стоит прибегать только в
случаях если оригинал напечатан шрифтом 9 и менее пунктов.
Установив в FineReader'e 6.0 (далее FR) опцию Tools -> Options ->
Scan/Open Image -> Use TWAIN-Source interface вы получите возможность
непосредственно управлять процессом сканирования через клиентскую программу
своего сканера. То есть вам не надо будет лихорадочно перелистывать книжку,
во время обратного хода лампы, и сканирования следующего разворота будет
начинаться только после того, как вы отдадите команду путем тыканья кнопки
"Scan" (или аналогичной) в программе сканирования.
Можно установить опцию "Разрезать на страницы" (Tools -> Options ->
Scan/Open Image -> Split dual pages), которая облегчит контроль за
пропущенными при сканированию страницами и последующую работу с полученными
изображениями, а также, вероятно, улучшит качество распознавания, так как FR
сам пытается "довернуть" половинку страницы до правильного, по его мнению,
положения. Картинку разворота же, если страницы "разваливаются" в стороны
или скошены внутрь исправить таким путем невозможно. Однако у этой полезной,
в сущности, опции есть и оборотные стороны. При сканировании поэтических
произведений, строки которых сильно разбросаны по вертикали, случаются
неприятные казусы в виде разрезания отсканированного разворота не по темной
полосе сгиба, а горизонтально, по промежутку между строками.
РАБОТА С ПОЛУЧЕННЫМИ ИЗОБРАЖЕНИЯМИ СТРАНИЦ
Если отсканированная книжка была оформлена без особых изысков,
например, это был обычный прозаический текст, разлитый по страницам без
витиеватостей и в одну колонку, то можно смело отдавать команду "распознать
все", после чего FR с успехом оправдает свое название. (Не факт - bmn)
Ежели же вы были оригинальны и отсканировали книжку стихов или пуще
того, какую-нибудь пьесу, то настоятельно рекомендую сначала "выделить блоки
на всех станицах" (ctrl+shift+E), потом последовательно пробежаться и
просмотреть все ли правильно.
Особенно достается пьесам. Бедный FR старается как может, но раскрыть
коварные замыслы верстальщика вкупе с автором он не всегда в силах. (Он и не
пытается, а просто фантазирует, а фантазия у него ой какая богатая и
необузданная. - bmn.)
Если этот этап успешно пройден и нажатие на "Распознать все" приводит к
"В пакете нет нераспознанных страниц", можно переходить к следующему этапу.
ВЫБОР ВАРИАНТА СОХРАНЕНИЯ ТЕКСТА
Отметим, что еще на стадии распознавания, надо помнить следующее:
страницы на которых преобладает прозаический текст стоит распознавать
включив опцию Tools -> Options -> Recognition -> Autodetect и отключив Tools
-> Options -> Formatting -> Formats Settings -> TXT все галочки, а страницы
на которых преобладает текст поэтический, где важны расставленные автором
окончания строк (абзацы) необходимо распознавать включив галочку Keep line
breaks и включив опцию Tools -> Options -> Recognition -> Plain text
formatted with spaces. (Не согласен, даже для прозы лучше держать
включенными галочки в опциях сохранения "Сохранять деление на строки" и
"Разделять абзацы пустыми строками". И обязательно поставить первый сервис
пак, тогда FR будет лучше определять конец абзаца. - bmn)
Более того, при окончательном сохранении текста в файле, стоит
сохранять файлы с прозаическим и поэтическим форматированием отдельно, для
последующей же раздельной с каждым работы. Окончательное объединение стоит
производить только на заключительном этапе компоновки готового и вычитанного
файла. Исключение составляют только очень сильно разноплановые тексты, тогда
решение стоит принимать оценив преобладающий тип, помня, однако, что убирать
лишние разделители абзацев в прозе сложнее. (Не, я сразу все делаю, ошибок
меньше будет при разных "вырезать-вклеить". - bmn)
После сохранения получаем текст, где абзацы расставлены приблизительно
так, как они должны стоять. Лишние абзацы стоят, естественно, в начале новой
страницы, а потери абзацев случаются чаще всего в диалогах. Это придется
отслеживать глазками при вычитке.
Сохраняем полученный текст как "Только текст".
Открываем полученный текст в любимом народом текстовом редакторе (MS
Word (97 и выше)).
Заменяем "^p" на "^p " (возврат каретки заменить на возврат каретки и
пять пробелов). (При согласии с моими рекомендациями "^p^p" на "^p " два
возврата каретки заменить на возврат каретки и пять пробелов. Субъективно
мне кажется, что в этом случае точнее определяются абзацы, даже в диалогах.
- bmn)
Сохраняем файл как "текст DOS" (с другими кодировками текстформ
работать не умеет.
Прогоняем его через textform (см. ниже).
Открываем снова.
Рекомендуется сохранять работу не как "текст DOS", а как "текст DOS с
разбиением на строки", так как после работы некоторых вордовских макросов
в тексте иногда появляются лишние переводы строк (не возвраты каретки)
которые при сохранении как "текст DOS" превращаются в возвраты каретки и
портят картинку.
Вот тут-то и начинается собственно процесс правки.
Наша цель - получить текстовый файл максимально свободный от ошибок и
соответствующий требованиям: абзацный отступ в 5 пробелов, выравнивание
пробелами по ширине в 76 символов, DOS кодировка.
Для достижения этой цели мы должны сформировать файлик с, по крайней
мере, выровненной левой границей и установленными абзацами.
В выравнивании правой границы нам поможет программка textform, которую
можно взять вот тут: http://lib.ru/COMPULIB/ocr_bychkov_textfmt.rar
Прогнать файлик через текстформ настоятельно рекомендуется как перед,
так и после правки. Прогон файлика перед правкой полезен тем, что таким
образом все характерные ошибки текстформа, вроде потерь дефисов стоящих в
конце строк, будут замечены и исправлены (Если до того как прогнать через
textform сделать замену ".-" на ". - ", ",-" на ", - ", "!-" на "! - ", "?-"
на "? - ", "съеденных" правильных тире будет намного меньше, поскольку
textform уже не будет рассматривать такие случаи как переносы. Проверено
опытным путем. - bmn)
Это дело работает только в командной строке и только с текстовыми
файликами в формате DOS. Недостатком textform'а является то, что он режет
дефисы оказавшиеся перед знаком возврата каретки, в результате чего
приходиться отлавливать конструкции вроде "чегонибудь", "ктото" (Опять же,
от этого спасает последующая глобальная замена, можно даже макрос написать
несложный. - bmn).
Итоговый файл сохраняем обязательно как "текст DOS c разделением на
строки", так как иначе могут пропасть некоторые переводы строки,
размеченные Вордом не как "возврат каретки", а как "разрыв строки", что
случается сравнительно часто после использования макросов.
Перед первой строкой абзаца ставятся пять пробелов.
После всех знаков препинания ставятся пробелы. Перед знаком препинания
пробел ставится только перед тире.
Сноски внизу страницы оформляются так: {Текст сноски} и вставляются в
место сноски в основном тексте.
Ссылки на примечания в конце текста оформляются так [Цифра]. (Не, я
использую те же фигурные скобки. - bmn)
Перед заголовком главы или части текста ставятся два возврата каретки.
Поэтический текст для удобства чтения оформляется также как в книге - в
простых стихах центрируется первая строка (Не первая, а средняя по длине
первая часто очень длинная или очень короткая, поверьте моему опыты. - bmn)
и по ней центрируется вся остальная часть стихотворения (макрос 3), в сложно
оформленных и белых стихах центрируется самая длинная строка в фрагменте
(Опять же, не самая длинная, а средняя. - bmn) и по ней центрируются все
остальные (макрос 11). Когда текст чересчур сложнооформленный, макросы
используются только для черновой подготовки.
Кусок поэтического текста внутри прозы выделяется отбивками сверху и
снизу.
Существенно облегчить процесс правки помогут несколько полезных
макросов. Листинги макросов приводятся в Приложении. Редактор Visual Basic
в Word'e вызывается alt+F11.
1. Макрос автоотбивки, который автоматически устанавливает 5 пробелов
перед текущей строкой.
2. Макрос установки главы - превращает строку в строку-заголовок,
которую серверный скрипт помещает в автогенерируемое оглавление.
3. Макрос центрирования строки. Работает в двух режимах. Первый -
центрирование строки пробелами по центру. Второй - центрирование блока
(центрирование блока по первой строке и центрирование по отцентрированной
первой строке всего блока). Для второго режима блок строк необходимо
выделить перед запуском макроса.
4. Макрос выравнивания по правому краю. Строка выравнивается пробелами
по правому краю.
5. Макрос центрирования с защитой от попадания в автогенерируемое
оглавление. Используется когда надо обойти скрипт на lib.ru, который строки
набранные заглавными буквами считает названиями глав.
6. Макросы выделения ссылки на примечания.
7. Специфический макрос - разделение окна документа на два окна. Удобно
пользоваться при правке текста насыщенного примечаниями и сносками.
8. Макрос установки тэга "курсив" на выделенный кусок текста. Вместо
тэга "курсив" можно вписать любые html-тэги оформления текста.
9. "Поэтический" макрос. Просматривает выделенный фрагмент текста,
определяет самую длинную строку в выделенном фрагменте (См. выше про
оформление поэтических тестов. - bmn) и центрирует весь выделенный массив
строк по этой самой длинной строке.
Все вышеизложенное может быть принято на веру, но не есть истина в
последней инстанции и является лишь обобщением личного опыта.
(По результатам длительных наблюдений могу сообщить некоторые
подробности о пьесах. У античных пьес обычно строки начинаются с 13-17
символа, у испанских, как правило, исключений пока мне не попадалось - с 25.
У английских - с 21-23 символа. - bmn)
<> Макросы <>
1) АВТООТБИВКА
Sub AltEnter()
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.TypeText Text:=" "
End Sub
2) ГЛАВА
Sub CtrlAltShiftEnter()
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=""
Selection.EndKey Unit:=wdLine
Selection.TypeText Text:=""
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
End Sub
3) ЦЕНТРИРОВАНИЕ
Sub AltE()
1 Dim N As String
3 Dim pos As Integer
2 Dim x, y, i, f, c, j, Mypos As Integer
4 Dim F1, F2 As String
x = Selection.Start
y = Selection.End
N = ActiveDocument.Range(x, y).Text
F2 = Chr$(13)
f = 1
c = 0
Rem Подсчет возвратов каретки в выделенном фрагменте
20 Mypos = InStr(f, N, F2, 1)
22 If Mypos <> 0 Then f = Mypos + 1: c = c + 1: GoTo 20
Rem Выравнивание по центру
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
pos = Selection.EndKey(Unit:=wdLine, Extend:=wdMove)
Selection.HomeKey Unit:=wdLine
80 x = Int((76 - pos) / 2)
Rem MsgBox (x)
Rem выравнивание по центру первой строки выделения
90 For i = 1 To x
100 Selection.TypeText Text:=" "
110 Next i
Rem выравнивание по центру первой строки выделения
Rem выравнивание по первой строке выделения всех остальных
For j = 1 To c - 1
Selection.HomeKey Unit:=wdLine
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
For i = 1 To x
Selection.TypeText Text:=" "
Next i
Next j
j = 0
End Sub
4) ВЫРАВНИВАНИЕ ПО ПРАВОМУ КРАЮ
Sub AltR()
1 Dim N As String
3 Dim pos As Integer
2 Dim x, i As Integer
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
pos = Selection.EndKey(Unit:=wdLine, Extend:=wdMove)
Selection.HomeKey Unit:=wdLine
80 x = Int((76 - pos))
90 For i = 1 To x
100 Selection.TypeText Text:=" "
110 Next i
End Sub
5) ВЫРАВНИВАНИЕ ПО ЦЕНТРУ С ЗАЩИТОЙ
Sub ctrlaltM()
'
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.Delete Unit:=wdWord, Count:=1
Selection.TypeText Text:="<> "
Selection.EndKey Unit:=wdLine
Selection.TypeText Text:=" <>"
1 Dim N As String
3 Dim pos As Integer
2 Dim x, y, i, f, c, j, Mypos As Integer
4 Dim F1, F2 As String
x = Selection.Start
y = Selection.End
N = ActiveDocument.Range(x, y).Text
F2 = Chr$(13)
f = 1
c = 0
Rem Подсчет возвратов каретки в выделенном фрагменте
20 Mypos = InStr(f, N, F2, 1)
22 If Mypos <> 0 Then f = Mypos + 1: c = c + 1: GoTo 20
Rem Выравнивание по центру
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
pos = Selection.EndKey(Unit:=wdLine, Extend:=wdMove)
Selection.HomeKey Unit:=wdLine
80 x = Int((76 - pos) / 2)
Rem выравнивание по центру первой строки выделения
90 For i = 1 To x
100 Selection.TypeText Text:=" "
110 Next i
Rem выравнивание по первой строке выделения всех остальных
For j = 1 To c - 1
Selection.HomeKey Unit:=wdLine
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
For i = 1 To x
Selection.TypeText Text:=" "
Next i
Next j
j = 0
End Sub
4) ВЫРАВНИВАНИЕ ПО ПРАВОМУ КРАЮ
Sub AltR()
1 Dim N As String
3 Dim pos As Integer
2 Dim x, i As Integer
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
pos = Selection.EndKey(Unit:=wdLine, Extend:=wdMove)
Selection.HomeKey Unit:=wdLine
80 x = Int((76 - pos))
90 For i = 1 To x
100 Selection.TypeText Text:=" "
110 Next i
End Sub
End Sub
6) МАКРОСЫ ВЫДЕЛЕНИЯ ССЫЛКИ НА ПРИМЕЧАНИЯ
Одна циферка
Sub ctrlNum1
Selection.TypeText Text:=" ["
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="]"
End Sub
Две циферки
Sub ctrlNum2
Selection.TypeText Text:=" ["
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:="]"
End Sub
Три циферки
Sub ctrlNum3
Selection.TypeText Text:=" ["
Selection.MoveRight Unit:=wdCharacter, Count:=3
Selection.TypeText Text:="]"
End Sub
7) МАКРОСЫ РАЗДЕЛЕНИЯ ОКНА ДОКУМЕНТА
РАЗДЕЛИТЬ ОКНО ДОКУМЕНТА НА ДВА ОКНА
Sub ctrl1()
ActiveWindow.SplitVertical = 50
End Sub
ПЕРЕХОД ИЗ ОДНОГО ОКНА ВНУТРИ ДОКУМЕНТА В ДРУГОЕ
Sub ctrl`()
ActiveWindow.ActivePane.Next.Activate
End Sub
УБРАТЬ РАЗДЕЛЕНИЕ ОКНА ДОКУМЕНТА
Sub ctrl2()
ActiveWindow.SplitVertical = 0
End Sub
8) Макрос установки тэга "курсив"
Sub altI()
Selection.Cut
Selection.TypeText Text:="<I>"
Selection.Paste
Selection.TypeText Text:="</I>"
End Sub
8) "Поэтический" макрос
Sub ctrlaltE()
1 Dim N As String
3 Dim pos As Integer
2 Dim x, y, i, f, c, j, Mypos As Integer
4 Dim F1, F2 As String
Rem Если ничего не выделено, направляемся на выход
If Len(Selection.Text) < 2 Then GoTo 200
Rem Устраняем лишние пробелы в начале строки
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " "
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
With Selection.Find
.Text = " "
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " "
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " "
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^p "
.Replacement.Text = "^p"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
x = Selection.Start
y = Selection.End
N = ActiveDocument.Range(x, y).Text
F2 = Chr$(13)
f = 1
c = 0
p1 = 0
p2 = 0
ls = 0
lm = 0
Rem Поиск самой длинной строки
20 Mypos = InStr(f, N, F2, 1)
22 If Mypos <> 0 Then p2 = Mypos: ls = p2 - p1: f = Mypos + 1: c = c + 1: p1 = p2
24 If Mypos <> 0 And ls > lm Then lm = ls
25 If Mypos = 0 Then GoTo 30
26 GoTo 20
30 Rem Прыжок в начало выделения
Selection.HomeKey Unit:=wdLine
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
Rem Определяем общий отступ
x = Int((76 - lm) / 2)
Selection.HomeKey Unit:=wdLine
Rem выравнивание первой строки выделения по центральной позиции самой длинной строки
90 For i = 1 To x
100 Selection.TypeText Text:=" "
110 Next i
Rem выравнивание по центральной позиции самой длинной строки выделения всех остальных
For j = 1 To c - 1
Selection.HomeKey Unit:=wdLine
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.TypeText Text:=" "
Selection.HomeKey Unit:=wdLine
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
For i = 1 To x
Selection.TypeText Text:=" "
Next i
Next j
j = 0
200 Rem Ссылка - Если ничего не выделено -
End Sub
Популярность: 17, Last-modified: Wed, 29 Oct 2003 10:56:27 GmT