使用pdfbox解析pdf文档

jopen 10年前

 

首先介绍一下pdfbox,
    1、使用PDFBox处理PDF文档

    PDF全称Portable Document Format,是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关,可以在Windows、Unix或Mac OS等操作系统上通用。
PDF文件格式将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。如果要抽取其中的文本信息,需要根据它的文件格式来进行解析。幸好目前已经有不少工具能帮助我们做这些事情。
    2、PDFBox的下载

    最常见的一种PDF文本抽取工具就是PDFBox了,访问网址http://sourceforge.net/projects/pdfbox/,进入如 图7-1所示的下载界面。读者可以在该网页下载其最新的版本。本书采用的是PDFBox-0.7.3版本。PDFBox是一个开源的Java PDF库,这个库允许你访问PDF文件的各项信息。在接下来的例子中,将演示如何使用PDFBox提供的API,从一个PDF文件中提取出文本信息。
    3、在Eclipse中配置

    以下是在Eclipse中创建工程,并建立解析PDF文件的工具类的过程。
   (1)在Eclipse的workspace中创建一个普通的Java工程:ch7。
   (2)把下载的PDFBox-0.7.3.zip解压。
   (3)进入external目录下,可以看到,这里包括了PDFBox所有用到的外部包。复制下面的Jar包到工程ch7的lib目录下(如还未建立lib目录,则先创建一个)。
l bcmail-jdk14-132.jar
l bcprov-jdk14-132.jar
l checkstyle-all-4.2.jar
l FontBox-0.1.0-dev.jar
l lucene-core-2.0.0.jar
    然后再从PDFBox的lib目录下,复制PDFBox-0.7.3.jar到工程的lib目录下。
   (4)在工程上单击右键,在弹出的快捷菜单中选择“Build Path->Config Build Path->Add Jars”命令,把工程lib目录下面的包都加入工程的Build Path。
    4、使用PDFBox解析PDF内容

    在刚刚创建的Eclipse工程中,创建一个pdf包,并创建一个PdfParser类。该类包含一个getText方法,用于从一个PDF中获取文本信息,其代码如下。
 
package pdf;  import java.io.BufferedWriter;  import java.io.FileInputStream;  import java.io.FileWriter;  import org.pdfbox.pdfparser.PDFParser;  import org.pdfbox.util.PDFTextStripper;  public class PdfParser {  // TODO 自动生成方法存根  public static void main(String[] args) throws Exception {  FileInputStream fis = new FileInputStream("搜索引擎第八章.pdf");  BufferedWriter writer = new BufferedWriter(new FileWriter("change.txt"));  PDFParser p = new PDFParser(fis);  p.parse();  PDFTextStripper ts = new PDFTextStripper();  String s = ts.getText(p.getPDDocument());  writer.write(s);  System.out.println(s);  fis.close();  writer.close();  }  }

</div>
以下是个人的案例,可以借鉴一下。可能会出现控制台乱码的问题,这里贴一下解决方案:
解决办法: 
在代码区域右键 -> run as -> run configurations -> common(右侧) -> console encoding 
如果出现此错误,此时的编码格式应该是UTF-8,选择Other,这时可能没有GBK选项,如果没有,则执行之后操作。
好了,下面是个人的代码:
package pdf;  import java.io.*;  import java.net.MalformedURLException;  import java.net.URL;  import org.pdfbox.pdmodel.PDDocument;  import org.pdfbox.util.PDFTextStripper;  public class PdfParser {  public void geText(String file) throws Exception {  // 是否排序    boolean sort = false;  // pdf文件名    String pdfFile = file;  // 输入文本文件名称    String textFile = null;  // 编码方式    String encoding = "UTF-8";  // 开始提取页数    int startPage = 1;  // 结束提取页数    int endPage = Integer.MAX_VALUE;  // 文件输入流,生成文本文件    Writer output = null;  // 内存中存储的PDF Document    PDDocument document = null;  try {       try {          // 首先当作一个URL来装载文件,如果得到异常再从本地文件系统//去装载文件          URL url = new URL(pdfFile);          document = PDDocument.load(url);          // 获取PDF的文件名          String fileName = url.getFile();            // 以原来PDF的名称来命名新产生的txt文件          if (fileName.length() > 4) {             File outputFile = new File(fileName.substring(0, fileName.length() - 4) + ".txt");             textFile = outputFile.getName();          }       } catch (MalformedURLException e) {            // 如果作为URL装载得到异常则从文件系统装载          document = PDDocument.load(pdfFile);          if (pdfFile.length() > 4) {             textFile = pdfFile.substring(0, pdfFile.length() - 4) + ".txt";          }       }       // 文件输入流,写入文件倒textFile       output = new OutputStreamWriter(new FileOutputStream(textFile), encoding);       // PDFTextStripper来提取文本       PDFTextStripper stripper = null;       stripper = new PDFTextStripper();  // 设置是否排序       stripper.setSortByPosition(sort);  // 设置起始页       stripper.setStartPage(startPage);  // 设置结束页       stripper.setEndPage(endPage);  // 调用PDFTextStripper的writeText提取并输出文本       stripper.writeText(document, output);    } finally {       if (output != null) {          // 关闭输出流          output.close();       }       if (document != null) {          // 关闭PDF Document          document.close();       }    }  }  public static void main(String[] args){  PdfParser test = new PdfParser();    try {       // 取得C盘下的index.pdf的内容       test.geText("C:\\云计算入门.pdf");       FileReader fr = new FileReader("C:\\云计算入门.txt");//需要读取的文件路径  BufferedReader br= new BufferedReader(fr);  String s = br.readLine();  while(s!=null)//如果当前行不为空  {  System.out.println(s);//打印当前行  s= br.readLine();//读取下一行  }  br.close();//关闭BufferReader流  fr.close();        } catch (Exception e) {       e.printStackTrace();    }      }  }