• Java实现PDF文字内容识别,结合OCR实现PDF图片实现


    使用插件:UMI-OCR、PDFBOX

    实现思路:通过PDFBOX识别PDF文字,如果是图片,则识别不出来,再调用OCR进行识别返回文字;OCR识别较慢,长图识别不出来,目前HTTP方式只支持图片格式,还需使用PDFBOX要将每一页PDF转换为图片再进行识别拼接。

    UMI-OCR下载地址:https://github.com/hiroi-sora/Umi-OCR/releases/latest

    git仓库地址:GitHub - hiroi-sora/Umi-OCR: OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。

    下载后直接在WIN系统安装(目前只支持WIN系统),安装包内含PaddleOCR-json,无需再进行下载;安装启动,设置HTTP请求参数

    全局设置 --> 高级 --> 允许HTTP服务:

    主机设置为:任何可用地址

    端口:自己设置

    PDFBOX MAVEN版本配置:

    1. <!-- PDF文档处理 -->
    2. <dependency>
    3. <groupId>org.apache.pdfbox</groupId>
    4. <artifactId>pdfbox</artifactId>
    5. <version>2.0.8</version>
    6. </dependency>

    代码实现文字识别:

    1. String text = "";
    2. try {
    3. PDDocument pdDocument = PDDocument.load(image.getInputStream());
    4. PDFTextStripper pdfTextStripper = new PDFTextStripper();
    5. //读取pdf中所有的文件
    6. //前端HTML不识别><,需要进行更换
    7. text = pdfTextStripper.getText(pdDocument);
    8. text = text.replace(" ", "")
    9. .replace("\r", "")
    10. .replace("\t", "")
    11. .replace("\n", "");
    12. if (StrUtil.isNotEmpty(text)){
    13. text = text.replace("<","<").replace(">",">");
    14. }else{
    15. /**
    16. * 如果没有识别到文字,
    17. * 则转成图片
    18. * 进行OCR识别获取文本
    19. */
    20. text = uploadPDF2OcrGetText(accessUrl, image);
    21. }
    22. }catch (IOException e){
    23. log.error(e.getMessage());
    24. }

    如果文档里面含有"<"">",前端HTML不识别,则需要进行转换

    uploadPDF2OcrGetText:
    1. /**
    2. * 上传图片文件至OCR
    3. * @param accessUrl 访问地址
    4. * @param image 图片文件
    5. * @return
    6. */
    7. public static String uploadPDF2OcrGetText(String accessUrl, MultipartFile image) {
    8. List<ByteArrayOutputStream> list = getStreamList(image);
    9. StringBuilder sb = new StringBuilder();
    10. if (list != null && !list.isEmpty()){
    11. for (ByteArrayOutputStream outputStream : list) {
    12. String str = getData(accessUrl, outputStream);
    13. if (StrUtil.isNotEmpty(str)){
    14. sb.append(str);
    15. }
    16. }
    17. }
    18. return sb.toString();
    19. }

    将PDF转为图片流方法getStreamList:

    1. /**
    2. * PDFBOX将PDF转成png流
    3. * @param file 图片文件
    4. * @return List
    5. */
    6. public static List<ByteArrayOutputStream> getStreamList(MultipartFile file) {
    7. List<ByteArrayOutputStream> list = new ArrayList<>();
    8. try{
    9. PDDocument pdf = PDDocument.load(file.getInputStream());
    10. PDFRenderer renderer = new PDFRenderer(pdf);
    11. int pageCount = pdf.getNumberOfPages();
    12. for (int i = 0; i < pageCount; i++){
    13. BufferedImage image = renderer.renderImageWithDPI(i, 120);//120为DPI根据自己设置
    14. ByteArrayOutputStream bas = new ByteArrayOutputStream();
    15. ImageIO.write(image, "png", bas);
    16. list.add(bas);
    17. }
    18. }catch (IOException e){
    19. log.error(e.getMessage());
    20. }
    21. return list;
    22. }

    调用OCR识别文字方法getData:

    1. /**
    2. * 上传图片文件至OCR
    3. * @param accessUrl 访问地址
    4. * @param outputStream 图片流
    5. * @return
    6. */
    7. public static String getData(String accessUrl, ByteArrayOutputStream outputStream){
    8. //转换为Base64
    9. String base64Image = new String(Base64.encodeBase64(outputStream.toByteArray()));
    10. //如果文件属于图片则进行文件转换
    11. JSONObject jb = new JSONObject();
    12. jb.set("base64", base64Image);
    13. JSONObject jb1 = new JSONObject();
    14. jb1.set("tbpu.parser", "multi_para");
    15. jb1.set("data.format", "text");
    16. jb.set("options", jb1);
    17. String result2 = HttpRequest.post(accessUrl)
    18. .body(jb.toString())//表单内容
    19. .timeout(300000)//数据可能较大,超时时间调的较长
    20. .execute().body();
    21. JSONObject jsonObject = JSONUtil.parseObj(result2);
    22. String text = null;
    23. if ("100".equals(jsonObject.getStr("code"))){
    24. text = jsonObject.getStr("data");
    25. }
    26. return text;
    27. }
  • 相关阅读:
    kubernetes
    【23真题】均分130,兵工七子,速速拿下!
    【无标题】
    Programming Differential Privacy第十五章Synthetic Data合成数据
    2022年Android面试之Jetpack(AAC框架)篇
    移动安全实战分享
    图像的SIFT特征点提取
    DDS的一点理解
    C++ 命名空间-----namespace(超详细解析,小白必看系列)
    NOIP2023游记
  • 原文地址:https://blog.csdn.net/stringjava_001/article/details/136698099