使用pdfbox及orc进行pdf文件的文字及图片的识别
pom设置相关依赖
<!--pdf相关依赖开始-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jempbox</artifactId>
<version>1.8.11</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>xmpbox</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>preflight</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.0</version>
</dependency>
<!--pdf相关依赖结束-->
<!--orc识别图片文字信息开始 Tess4J是对Tesseract OCR API 的Java JNA 封装-->
<!-- 使 java 能够通过调用 Tess4J 的 API 来使用 Tesseract OCR。支持的格式包括 TIFF、JPEG、GIF、PNG、BMP、JPEG、PDF -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.8</version>
</dependency>
<!--orc识别图片文字信息结束-->
编写的测试类
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
/**
* pdf 功能测试
* @author
*/
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = PdfTest.class)
public class PdfTest {
@Test
public void t() throws Exception {
String dir = "D:\\s\\pdf\\20230202";
//要读取的pdf文档位置
String path = dir+"/s0131_中文_sE980F1C.pdf";
// String path =dir+"/1.pdf";
File file = new File(path);
//加载pdf文件,创建PDDocument对象
PDDocument document = PDDocument.load(file);
//创建pdf文本获取对象PDFTextStripper
PDFTextStripper pdfStripper = new PDFTextStripper();
//获取pdf中所有信息,text中包含的就是当前pdf文档中所有信息
String text = pdfStripper.getText(document);
System.out.println(text);
//读取pdf 图片信息
PDImageXObject ximage = new PDImageXObject(document);
PDPageTree pages = document.getPages();
PDPage page = document.getPage(4);
PDResources resources = page.getResources();
Iterable<COSName> cosNames = resources.getXObjectNames();
if (cosNames != null) {
Iterator<COSName> cosNamesIter = cosNames.iterator();
while (cosNamesIter.hasNext()) {
COSName cosName = cosNamesIter.next();
if (resources.isImageXObject(cosName)) {
PDImageXObject Ipdmage = (PDImageXObject) resources.getXObject(cosName);
BufferedImage image = Ipdmage.getImage();
execute(image);
}
}
}
}
// 执行OCR识别
private void execute(BufferedImage targetImage) {
String tempImage = "D:\\s\\test.jpg";
try {
File tempFile = new File(tempImage);
if (tempFile == null) {
tempFile.mkdirs();
}
tempFile.mkdirs();
ImageIO.write(targetImage, "jpg", tempFile);
} catch (IOException e) {
e.printStackTrace();
}
File file = new File(tempImage);
ITesseract instance = new Tesseract();
// 设置语言库位置
instance.setDatapath("D:\\chamc\\ideaworkspace\\chamc-internalfund\\internalfund\\src\\main\\resources/data");
// 设置语言,默认是英文(识别字母和数字),如果要识别中文(数字 + 中文),需要制定语言包
instance.setLanguage("chi_sim");
String result = null;
try {
result = instance.doOCR(file);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void tp() throws Exception{
String tempImage = "D:\\华融\\内部资金\\23年1月份\\pdf\\20230202\\2.png";
File file = new File(tempImage);
ITesseract instance = new Tesseract();
// 设置语言库位置
instance.setDatapath("D:\\chamc\\ideaworkspace\\chamc-internalfund\\internalfund\\src\\main\\resources\\data\\");
// 设置语言,默认是英文(识别字母和数字),如果要识别中文(数字 + 中文),需要制定语言包
instance.setLanguage("chi_sim");
String result = null;
try {
result = instance.doOCR(file);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行可以得到pdf 的相关文字图片信息。
文字处理比较简单。
图片有些问题 如果图片在保存的时候修改了他的原本后缀则识别会提示与原先图片类型不符(比如原先的图片是png后缀改成jpg就识别不了);另识别出来的文字会有乱码和多余的一些符号。