Java识别PDF文字内容的方法

介绍了纯Java类库PDFBox,它是在BSD许可下的源码开放项目,可用于读取和创建PDF文档。其特性包括提取文本、加密解密、导入导出表单数据等。官网为http://pdfbox.apache.org/index.html ,当前最新版本1.8.8,使用需相关jar包,但它分析文字时对顺序、格式等控制欠佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:PDFBox

(一个BSD许可下的源码开放项目)是一个为开发人员读取和创建PDF文档而准备的纯Java类库。它提供如下特性:

提取文本,包括Unicode字符。和Jakarta Lucene等文本搜索引擎的整合过程十分简单。加密/解密PDF文档。从PDF和XFDF格式中导入或导出表单数据。向已有PDF文档中追加内容。将一个PDF文档切分为多个文档,覆盖PDF文档。

官网:http://pdfbox.apache.org/index.html    截止当前最新版本1.8.8
 

/**

 * PdfboxUtil.java

 * Create on 2015-1-5

 */

package charlie.utils.pdf;

 

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.io.InputStream;

 

import org.apache.pdfbox.pdfparser.PDFParser;

import org.apache.pdfbox.pdmodel.PDDocument;

import org.apache.pdfbox.util.PDFTextStripper;

 

/**

 * @author CharlieChen

 * @DateTime 2015-1-5 上午9:55:38

 * @version 1.0

 */

public class PdfboxUtil {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

      String pdfPath = "D:/temp/成交单-PDF格式.pdf";

      String txtfilePath = "D:/temp/成交单-PDF格式-pdfbox.txt";

      PdfboxUtil pdfutil = new PdfboxUtil();

      try {

         String content = pdfutil.getTextFromPdf(pdfPath);

         pdfutil.toTextFile(content, txtfilePath);

         System.out.println("Finished !");      

      } catch (Exception e) {

         e.printStackTrace();

      }

 

   }

  

   /**

    * 读取PDF文件的文字内容

    * @param pdfPath

    * @throws Exception

    */

   public String getTextFromPdf(String pdfPath) throws Exception {

      // 是否排序

      boolean sort = false;

      // 开始提取页数

      int startPage = 1;

      // 结束提取页数

      int endPage = Integer.MAX_VALUE;    

     

      String content = null;

      InputStream input = null;

      File pdfFile = new File(pdfPath);

      PDDocument document = null;

      try {

         input = new FileInputStream(pdfFile);

         // 加载 pdf 文档

         PDFParser parser = new PDFParser(input);

         parser.parse();

         document = parser.getPDDocument();

         // 获取内容信息

         PDFTextStripper pts = new PDFTextStripper();

         pts.setSortByPosition(sort);

         endPage = document.getNumberOfPages();

         System.out.println("Total Page: " + endPage);

         pts.setStartPage(startPage);

         pts.setEndPage(endPage);

         try {

            content = pts.getText(document);

         } catch (Exception e) {

            throw e;

         }

         System.out.println("Get PDF Content ...");

      } catch (Exception e) {

         throw e;

      } finally {

         if (null != input)

            input.close();

         if (null != document)

            document.close();

      }

     

      return content;

   }

 

   /**

    * 把PDF文件内容写入到txt文件中

    * @param pdfContent

    * @param filePath

    */

   public void toTextFile(String pdfContent,String filePath) {     

      try {

         File f = new File(filePath);

         if (!f.exists()) {

            f.createNewFile();

         }

         System.out.println("Write PDF Content to txt file ...");

         BufferedWriter output = new BufferedWriter(new FileWriter(f));

         output.write(pdfContent);

         output.close();

      } catch (Exception e) {

         e.printStackTrace();

      }

   }

}

https://blog.csdn.net/charliechen1989/article/details/42425617

另需要commons-logging和fontbox-1.8.8的jar包

 

pdfbox只能做到把文字分析出来,并无法很好的控制分析的顺序,格式,字体等信息。

排序sort为true后,PDF按行读取,保持了顺序,但是遇到分栏,分页就会需要额外处理

 

### Java 实现 PDF 文件的文字识别 #### 使用 Apache PDFBox 进行文字提取 Apache PDFBox 是一个开源的 Java 库,可以用来创建、操作和读取 PDF 文档。对于简单的文本提取任务来说非常方便。 ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; public class PdfToText { public static void main(String[] args) throws Exception { PDDocument document = null; try { document = PDDocument.load(new File("example.pdf")); if (!document.isEncrypted()) { PDFTextStripper pdfStripper = new PDFTextStripper(); String text = pdfStripper.getText(document); System.out.println(text); } } finally { if (document != null) { document.close(); } } } } ``` 这段代码展示了如何加载 PDF 文件并从中抽取纯文本内容[^1]。 #### 结合 Tesseract OCR 处理复杂情况 当遇到扫描件或其他形式的图像型 PDF 时,仅靠 PDFBox 可能无法有效工作。此时可以通过调用外部工具如 Tesseract 来完成光学字符识别(OCR),再将结果返回给应用程序。 Tesseract 支持多种编程语言绑定,在 Java 中通常通过 Tess4J 或者直接执行命令行来调用它。 ```java // 假设已经安装好 tesseract 并配置环境变量 PATH ProcessBuilder pb = new ProcessBuilder( "tesseract", "-l chi_sim", // 设置中文支持 "input.png", "output" ); pb.inheritIO(); pb.start().waitFor(); File outputFile = new File("output.txt"); BufferedReader reader = new BufferedReader(new FileReader(outputFile)); StringBuilder result = new StringBuilder(); String line; while ((line = reader.readLine()) != null){ result.append(line).append("\n"); } System.out.print(result.toString()); reader.close(); ``` 此方法适用于处理包含大量图形化内容的文档,并能够较好地解决由于字体嵌入缺失等原因造成的显示异常问题[^3]。 需要注意的是,实际应用过程中可能会碰到一些挑战,例如图片格式不匹配导致解析失败等问题[^4]。因此建议开发人员提前测试不同类型的输入样本以确保系统的鲁棒性和准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值