如何从PDF文件中获取俄语单词

如何从PDF文件中获取俄语单词,pdf,encoding,char,symbols,Pdf,Encoding,Char,Symbols,我使用Java的pdfbox-1.8.2来读取电子火车票文件 英语单词-正常阅读 俄语单词-不正常阅读 如何从PDF文件中获取正常的俄语单词 此代码帮助我: /** *木雕文,木雕文 *信使新 */ 静态字符串解码字符串(字符串编码消息){ StringBuilder decodeMessage=新建StringBuilder() 对于(int i=0;i map.put(startIndex++,symbol.toUpperCase()) } 俄语符号.each{symbol-> map.p

我使用Java的pdfbox-1.8.2来读取电子火车票文件

英语单词-正常阅读

俄语单词-不正常阅读

如何从PDF文件中获取正常的俄语单词

此代码帮助我:

/**
*木雕文,木雕文
*信使新
*/
静态字符串解码字符串(字符串编码消息){
StringBuilder decodeMessage=新建StringBuilder()
对于(int i=0;i
map.put(startIndex++,symbol.toUpperCase())
}
俄语符号.each{symbol->
map.put(startIndex++,符号)
}
返回图
}

PDF不包含这些俄语单词的常规文本提取所需的信息,相关字体设置IDENTITY-H(即基本上使用字体文件中的某些索引)不要提供ToUnicode映射。如果你知道所使用的字体,那么,通过使用字体信息将字节对映射到字符,你可能会成功。谢谢。我如何才能找到所使用的字体呢?测试@mkl的建议:文档中的纯文本是:“Ʌ 字形索引列表:599 581 575 580 588 586 584 583 583 597 579(等)。在
cour.ttf
中查找这些索引并将其翻译回Unicode确实会产生纯文本“ЛЛ掼掼掼掼掼掼掼掼掼掼掼掼掼!
/**
 * Конвертирует строку состояющую из индексов 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
}