1

Я разбираю файл PDF, чтобы извлечь текст с помощью Apache Tika.Удаление специальных символов из текста/PDF с помощью Apache Tika

//Create a body content handler 
BodyContentHandler handler = new BodyContentHandler(); 

//Metadata 
Metadata metadata = new Metadata(); 

//Input file path 
FileInputStream inputstream = new FileInputStream(new File(faInputFileName)); 

//Parser context. It is used to parse InputStream 
ParseContext pcontext = new ParseContext(); 

try 
{  
    //parsing the document using PDF parser from Tika. 
    PDFParser pdfparser = new PDFParser(); 

    //Do the parsing by calling the parse function of pdfparser 
    pdfparser.parse(inputstream, handler, metadata,pcontext); 

}catch(Exception e) 
{ 
    System.out.println("Exception caught:"); 
} 
String extractedText = handler.toString(); 

Выполнено над текстом и текстом из PDF.

В файле PDF есть специальные символы (например, @/&/£ или знак торговой марки и т. Д.). Как я могу удалить эти специальные символы во время или после процесса извлечения?

+0

W с регулярным выражением на строке? С помощью [String.replace] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace (java.lang.CharSequence,% 20java.lang.CharSequence))? – Gagravarr

ответ

1

PDF использует точки Юникода кода вы также можете иметь строки, содержащие суррогатные пары, сочетающие формы (например, для диакритических знаков) и т.д., и, возможно, пожелает сохранить их в качестве ближайшего ASCII эквивалент, например, нормализуют é к e. Если да, то вы можете сделать что-то вроде этого:

import java.text.Normalizer; 

String normalisedText = Normalizer.normalize(handler.toString(), Normalizer.Form.NFD); 

Если вы просто после ASCII текст, то, как только нормализовались можно фильтровать строку, которую вы получаете от Тика, используя регулярное выражение в this answer:

extractedText = normalisedText.replaceAll("[^\\p{ASCII}]", ""); 

Однако, поскольку регулярные выражения могут быть медленным (особенно на больших строк), вы можете избежать регулярных выражений и сделать простую замену (как на this answer):

public static String flattenToAscii(String string) { 
    char[] out = new char[string.length()]; 
    String normalized = Normalizer.normalize(string, Normalizer.Form.NFD); 
    int j = 0; 
    for (int i = 0, n = normalized.length(); i < n; ++i) { 
     char c = normalized.charAt(i); 
     if (c <= '\u007F') out[j++] = c; 
    } 
    return new String(out); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^