【问题标题】:Extract text from a pdf file using Apache Tika in java在java中使用Apache Tika从pdf文件中提取文本
【发布时间】:2018-01-06 22:11:35
【问题描述】:
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.File和导入org.apache.tika.Tika; 但是在运行此代码时,我遇到了这样的错误:

线程“主”java.lang.NoSuchMethodError 中的异常:org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)五 在 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) 在 org.apache.pdfbox.pdmodel.font.PDType1Font.(PDType1Font.java:79) 在 org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:62) 在 org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:143) 在 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) 在 org.apache.tika.parser.pdf.PDFParser.parse(PDFParser.java:167) 在 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 的那个

标签: java apache apache-tika


【解决方案1】:

以下似乎对我有用。 我得到了我想要的字符串,但我也在控制台中打印了一些警告。

[在 Windows 上] 我这样编译和运行它:

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

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

你用的是什么 tika 罐子? 我添加了另一种方法 (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();
        }
    }
}

【讨论】:

  • 感谢您的回答。我正在使用 tika-app-1.16.jar
  • 你能告诉我你用过哪些罐子,以便我可以删除其他罐子,因为在运行你的代码后它仍然向我显示同样的错误。
  • 感谢它运行良好。我只是在其中创建了一个新项目和一个新的 java 文件。
  • 我只使用了 1 个 jar 文件。我很高兴你能成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多