要从 PDF 文档(从所有页面)中提取单词,我们将覆盖 PDFTextStripper 的 writeText 方法。
org.apache.pdfbox.contentstream 类。PDFTextStripper 去除所有文本。
为了从 PDF 文档中提取提取词,我们将扩展这个 PDFTextStripper 类,拦截并实现 writeString(String str, List<TextPosition> textPositions)方法。
writeString 方法的第一个参数是一行。可以使用单词分隔符将该行拆分为单词。
从 PDF 文档中提取单词的步骤
以下是从 pdf 中提取单词的分步过程:
1.扩展PDFTextStripper
创建一个Java 类并使用 PDFTextStripper 对其进行扩展。
public class GetWordsFromPDF extends PDFTextStripper {
. . .
}
|
2.调用writeText方法
设置页面边界(从第一页到最后一页)以去除文本并调用方法 writeText()。
PDFTextStripper stripper = new GetCharLocationAndSize();
stripper.setSortByPosition( true );
stripper.setStartPage( 0 );
stripper.setEndPage( document.getNumberOfPages() );
Writer dummy = new OutputStreamWriter( new ByteArrayOutputStream());
stripper.writeText(document, dummy);
|
3.覆盖writeString
writeString 方法接收一行文本作为第一个参数。对 PDF 文档中的每一行文本调用 writeString 方法。
@Override
protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
. . .
}
|
4. 获取单词
通过单词分隔符拆分 writeString 方法接收到的字符串。
示例 1 – 从 PDF 中提取单词
在此示例中,我们将获取一个 PDF 文档,并从该 PDF 中提取所有单词。
GetWordsFromPDF.java
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
/**
* This is an example on how to extract words from PDF document
*/
public class GetWordsFromPDF extends PDFTextStripper {
static List<String> words = new ArrayList<String>();
public GetWordsFromPDF() throws IOException {
}
/**
* @throws IOException If there is an error parsing the document.
*/
public static void main( String[] args ) throws IOException {
PDDocument document = null ;
String fileName = "apache.pdf" ; // replace with your PDF file name
try {
document = PDDocument.load( new File(fileName) );
PDFTextStripper stripper = new GetWordsFromPDF();
stripper.setSortByPosition( true );
stripper.setStartPage( 0 );
stripper.setEndPage( document.getNumberOfPages() );
Writer dummy = new OutputStreamWriter( new ByteArrayOutputStream());
stripper.writeText(document, dummy);
// print words
for (String word:words){
System.out.println(word);
}
}
finally {
if ( document != null ) {
document.close();
}
}
}
/**
* Override the default functionality of PDFTextStripper.writeString()
*/
@Override
protected void writeString(String str, List<TextPosition> textPositions) throws IOException {
String[] wordsInStream = str.split(getWordSeparator());
if (wordsInStream!= null ){
for (String word :wordsInStream){
words.add(word);
}
}
}
}
|
输出
2017-8-6
Welcome
to
The
Apache
Software
Foundation!
Custom
Search
The
Apache
Way
(/foundation/governance/)
|
如果您想使用相同的 PDF 文件,请在此处下载 PDF 文档apache.pdf 。否则,您可以fileName
在 Java 程序中指定 PDF 文件路径。
结论
在这个Apache PDFBox 教程中,我们学习了从 PDF 中提取单词。您还可以参考PDF 中字符的提取坐标或位置。