如何从PDF文件中获取俄语单词
我使用Java的pdfbox-1.8.2来读取电子火车票文件 英语单词-正常阅读 俄语单词-不正常阅读 如何从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
/**
*木雕文,木雕文
*信使新
*/
静态字符串解码字符串(字符串编码消息){
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
}