Удалите специальные символы из текста /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 есть некоторые специальные символы (например, @/&/£ или знак товарного знака и т. Д.). Как я могу удалить эти специальные символы во время или после процесса извлечения?

1 ответ

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

import java.text.Normalizer;

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

Если вы просто после ASCII-текста, то после нормализации вы можете отфильтровать строку, полученную из Tika, используя регулярное выражение согласно этому ответу:

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

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

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);
}
Другие вопросы по тегам