Удалите специальные символы из текста /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);
}