如何使用Apache PDFBox从PDF文件中提取文本

2022-09-01 09:14:33

我想使用Apache PDFBox从给定的PDF文件中提取文本。

我写了这个代码:

PDFTextStripper pdfStripper = null;
PDDocument pdDoc = null;
COSDocument cosDoc = null;
File file = new File(filepath);

PDFParser parser = new PDFParser(new FileInputStream(file));
parser.parse();
cosDoc = parser.getDocument();
pdfStripper = new PDFTextStripper();
pdDoc = new PDDocument(cosDoc);
pdfStripper.setStartPage(1);
pdfStripper.setEndPage(5);
String parsedText = pdfStripper.getText(pdDoc);
System.out.println(parsedText);

但是,我收到以下错误:

Exception in thread "main" java.lang.NullPointerException
at org.apache.fontbox.afm.AFMParser.main(AFMParser.java:304)

我在类路径中添加了pdfbox-1.8.5.jar和fontbox-1.8.5.jar。

编辑

我添加到程序的开头。System.out.println("program starts");

我运行了它,然后我得到了与上面提到的相同的错误,并且没有出现在控制台中。program starts

因此,我认为我对类路径或其他问题有问题。

谢谢。


答案 1

使用PDFBox 2.0.7,这就是我获取PDF文本的方式:

static String getText(File pdfFile) throws IOException {
    PDDocument doc = PDDocument.load(pdfFile);
    return new PDFTextStripper().getText(doc);
}

这样称呼它:

try {
    String text = getText(new File("/home/me/test.pdf"));
    System.out.println("Text in PDF: " + text);
} catch (IOException e) {
    e.printStackTrace();
}

由于用户oivemaria在评论中问道:

您可以通过将 PDFBox 添加到应用程序中的依赖项来使用 PDFBox:build.gradle

dependencies {
  compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.7'
}

以下是有关使用 Gradle 进行依赖关系管理的更多信息。


如果要在解析的文本中保留PDF的格式,请尝试使用PDFLayoutTextStripper


答案 2

我执行了您的代码,并且它工作正常。也许您的问题与您提交的文件有关。我将我的pdf放在C驱动器中并硬编码文件路径。这是我的代码:FilePath

// PDFBox 2.0.8 require org.apache.pdfbox.io.RandomAccessRead
// import org.apache.pdfbox.io.RandomAccessFile;

public class PDFReader{
    public static void main(String args[]) throws IOException {
        PDFTextStripper pdfStripper = null;
        PDDocument pdDoc = null;
        File file = new File("C:/my.pdf");
        PDFParser parser = new PDFParser(new FileInputStream(file));
        parser.parse();
        try (COSDocument cosDoc = parser.getDocument()) {
            pdfStripper = new PDFTextStripper();
            pdDoc = new PDDocument(cosDoc);
            pdfStripper.setStartPage(1);
            pdfStripper.setEndPage(5);
            String parsedText = pdfStripper.getText(pdDoc);
            System.out.println(parsedText);
        }
    }
}

推荐