Question

I use pdfbox-1.8.2 for Java, that read file electronic train ticket.

English words - is normal read.

Russian words - is NOT normal read.

How get normal Russian words from PDF-file?

PDF-file example

PDF-to-txt file example

Was it helpful?

Solution

This code helped me more:

/**
 * Конвертирует строку состояющую из индексов Glyph, в нормальную строку
 * Для конвертирования используются индексы шрифта Courier New
 */
static String decodeString(String encodeMessage) {
    StringBuilder decodeMessage = new StringBuilder()
    for(int i=0; i<encodeMessage.length(); i++) {
        char symbol = encodeMessage.charAt(i)
        decodeMessage << decodeChar(symbol)
    }

    return decodeMessage.toString()
}

/**
 * Конвертирует символ, который получается из Glyph индекса, в нормальный символ
 * Для конвертирования используются индексы шрифта Courier New
 */
static String decodeChar(char symbol) {
    int symbolIndex = symbol as int

    String decodeSymbol = decodingMap.get(symbolIndex)

    //Для отладки: выводит индексы не распознанных символов
    if (DEBUG_MODE && !decodeSymbol) {
        println "null: $symbolIndex"
    }

    return decodeSymbol
}

/**
 * Создает хэш-мап соответствий индексов, символам
 * Часть символом записывается под Glyph-индексами, а часть под Unicode
 * (Так сделано потому, что в файле присутствоет и то, и другое)
 * Для конвертирования используются индексы шрифта Courier New
 */
private static Map<Integer, String> createDecodingMap() {
    Map map = [:]
    int startIndex = 0

    if (ADD_UNICODE) {
        //Добавление символов, записываемых под Unicode-индексами
        //В начале, чтобы индексы могли быть перезаписаны позже
        putUnicodeSymbols(map)
    }

    //Добавление разных знаков
    def otherSymbols = [3: ' ', 11: '(', 12: ')', 16: '-', 18: '/'] as Map<Integer, String>
    map.putAll(otherSymbols)

    //Добавление цифр
    def numbers = 0..9
    startIndex = 19
    numbers.each { num->
        map.put(startIndex++, num.toString())
    }

    //Добавление русских букв, сначало строчных, затем прописных
    def russianSymbols = ['а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё']
    startIndex = 570
    russianSymbols.each { symbol ->
        map.put(startIndex++, symbol.toUpperCase())
    }
    russianSymbols.each { symbol ->
        map.put(startIndex++, symbol)
    }

    return map
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top