使用Apache Tika在Java中从PDF文件中提取文本

4
try {
      File file = new File("Example.pdf");
      String content = new Tika().parseToString(file);
      System.out.println("The Content: " + content);
    } catch (Exception e) {
       e.printStackTrace();
    }

我已经导入了java.io.Fileorg.apache.tika.Tika,但是在运行此代码时,我收到了以下错误:

"主线程中出现异常:java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V 在org.apache.commons.logging.impl.SLF4JLocationAwareLog.warn(SLF4JLocationAwareLog.java:162)处发生。 在org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.loadDiskCache(FileSystemFontProvider.java:461)中,文件系统字体提供程序加载磁盘缓存。 在org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.(FileSystemFontProvider.java:217)中,创建文件系统字体提供程序。 在org.apache.pdfbox.pdmodel.font.FontMapperImpl$DefaultFontProvider.(FontMapperImpl.java:130)中,创建字体映射器的默认字体提供程序。 在org.apache.pdfbox.pdmodel.font.FontMapperImpl.getProvider(FontMapperImpl.java:149)中,获取字体映射器的字体提供程序。 在org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFont(FontMapperImpl.java:413)中,查找字体映射器的字体。 在org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFontBoxFont(FontMapperImpl.java:376)中,查找字体映射器的字体框架字体。 在org.apache.pdfbox.pdmodel.font.FontMapperImpl.getFontBoxFont(FontMapperImpl.java:350)中,获取字体映射器的字体框架字体。 在org.apache.pdfbox.pdmodel.font.PDType1Font.(PDType1Font.java:146)中,创建PDType1字体。 在org.apache.pdfbox.pdmodel.font.PDType1Font.(PDType1Font.java:79)中,创建PDType1字体。 在org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:62)中,创建字体。 在org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:143)中,获取PDF资源的字体。 在org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:60)中,设置字体和大小。 在org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:838)中,处理操作符。 在org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:495)中,处理流操作符。 在org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:469)中,处理流。 在org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:150)中,处理页面。 在org.apache.pdfbox.text.LegacyPDFStreamEngine.processPage(LegacyPDFStreamEngine.java:139)中,处理页面。 在org.apache.pdfbox.text.PDFTextStripper.processPage(PDFTextStripper.java:391)中,处理页面。 在org.apache.tika.parser.pdf.PDF2XHTML.processPage(PDF2XHTML.java:147)中,处理页面。 在org.apache.pdfbox.text.PDFTextStripper.processPages(PDFTextStripper.java:319)中,处理页面。 在org.apache.pdfbox.text.PDFTextStripper.writeText(PDFTextStripper.java:266)中,写入文本。 在org.apache.tika.parser.pdf.PDF2XHTML.process(PDF2XHTML.java:117)中,处理PDF。 在org.apache.tika.parser.pdf.PDFParser.parse(PDFParser.java:167)中,解析PDF。 在org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)中,解析。 在org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)中,解析。 在org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:135)中,自动检测并解析。 在org.apache.tika.Tika.parseToString(Tika.java:527)中,将文件解析为字符串。 在org.apache.tika.Tika.parseToString(Tika.java:642)中,将文件解析为字符串。 在java_programs.PdfParse.main(PdfParse.java:22)中,执行主函数。"

你是怎样将Apache Tika添加到你的项目中的?看起来你错误地使用了旧的slf4j jar,而不是Tika的jar。 - Gagravarr
1个回答

5
以下对我有效。我得到了想要的字符串,但在控制台中也打印出一些警告信息。
[在Windows上]我像这样编译和运行它:
javac -cp .;tika-app-1.16.jar Test.java

java -cp .;tika-app-1.16.jar Test

你正在使用哪个tika jar包? 我添加了另一种方法(tikaPdfTest())来展示从PDF中获取文本的不同方式,这可能会对你有所帮助。
import java.io.File;
import org.apache.tika.Tika;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.apache.tika.Tika;

import org.xml.sax.SAXException;

public class Test {
    public static void main(final String[] args) {
        //Your way
        try {
            File file = new File("Example.pdf");
            String content = new Tika().parseToString(file);
            System.out.println("The Content: " + content);
        } catch (final Exception e) {
            e.printStackTrace();
        }

        //Another way
        try {
            System.out.println("The contents:\t[" + Test.tikaPdfTest("Example.pdf") + "]");
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }

    public static String tikaPdfTest(final String fileName) throws IOException, SAXException, TikaException {
        try(final FileInputStream inputstream = new FileInputStream(new File(fileName))) {
            final BodyContentHandler handler = new BodyContentHandler();
            new PDFParser().parse(inputstream, handler, new Metadata(), new ParseContext());
            return handler.toString().trim();
        }
    }
}

1
谢谢你的回答。我正在使用tika-app-1.16.jar。 - Abhi Thakkar
你能告诉我你使用了哪些JAR包,这样我就可以删除其他的JAR包,因为在运行你的代码后仍然显示相同的错误。 - Abhi Thakkar
谢谢,它运行得很好。我只是创建了一个新项目和一个新的Java文件。 - Abhi Thakkar
我只使用了那一个JAR文件。 很高兴你已经让它工作了。 - Tmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接