我使用pdfbox-1.8.2 for Java,读取文件电子火车票
英语单词-是正常阅读。
俄语单词-是NOT normal read
如何从pdf文件中获得正常的俄语单词?
pdf文件示例PDF-to-txt文件示例
这段代码对我帮助更大:
/**
* Конвертирует строку состояющую из индексов 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
}