java - 使用 Apache Tika 从文本/PDF 中删除特殊字符

标签 java character-encoding special-characters apache-tika text-decoding

我正在解析 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文件中存在一些特殊字符(如@/&/£或商标符号等)。如何在提取过程中或提取后删除这些特殊字符?

最佳答案

PDF 使用 unicode 代码点,您可能拥有包含代理对、组合形式(例如变音符号)等的字符串,并且可能希望将它们保留为最接近的 ASCII 等效项,例如将 é 规范化为e。如果是这样,你可以这样做:

import java.text.Normalizer;

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

如果您只是在 ASCII 文本之后,那么一旦标准化,您可以使用正则表达式过滤从 Tika 获得的字符串,如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);
}

关于java - 使用 Apache Tika 从文本/PDF 中删除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121232/

相关文章:

python - Optparse-保留特殊字符

java - 使用 Ehcache 扩展 Java Web 应用程序

java - org.apache.commons.io.IOUtils.toString 错误解释 UTF-8

sql-server - 通过XML解析SQL中的字符错误

JSF 2.0 request.getParameter 返回编码错误的字符串

c++ - Unicode 字符 Visual C++

visual-studio-2010 - Visual Studio : show all special characters in a string

Java 1.8 拒绝解析带有美国/阿留申 (HAST) 时区的日期?

java - 如何在 Java 中获取输出流的名称(即 stderr 或 stdout)?

java - 如何使用java在Cassandra中添加6个月和1年的ttl