zoukankan      html  css  js  c++  java
  • Java pdf转String 并修正格式

    在尝试pdf转成String的时候,首先用python的pdfminer和pdfminer3k去尝试转换,然后资料看不太懂,就尝试用了java,

    以下是java的pdfbox写的pdf转String函数(main函数没有贴出来,直接用的一个全局函数)  需要加入的包有

    百度搜一下pdfbox去官网下载一个放在lib里就行了

    然后比较重要的突破是能把原来生成格式比较混乱的String处理成比较能看的String

    效果如下:

    没有转换前输出格式如下

    转换后格式:

     

     代码如下:

    import java.io.*;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;
    
    
    public static String  getText(String file) throws Exception {
    // 是否排序
    boolean sort = false;
    // PDF的本地路径或者url
    String pdfFile = file;
    // 编码方式
    String encoding = "UTF-8";
    // 开始提取页数
    int startPage = 1;
    // 结束提取页数
    int endPage = Integer.MAX_VALUE;
    // 文件输入流,生成文本文件
    Writer output = null;
    // 内存中存储的PDF Document
    PDDocument document = null;
    try{

    // 采用PDFTextStripper提取文本
    PDFTextStripper stripper = new PDFTextStripper();
    // 设置是否排序
    stripper.setSortByPosition(sort);
    // 设置起始页
    stripper.setStartPage(startPage);
    // 设置结束页
    stripper.setEndPage(endPage);
    String text = stripper.getText(document);

    //尝试把前边或后边接有空白字符的换行符换成其他的文字,然后把换行符替换掉,之后再把其他文字换成换行符
           //原理是pdf转成String中间有过多的回车换行符 这种,但是如果换行符前后都是有文字的(不为空),则这应该是一个被pdf强行换行出来的
    text = text.replaceAll("\r\n\s","Jacck"); //这里的Jacck最好换成一个更复杂的文本,作为中间替换物存在尽量在中间转化过程中和文档中没有任何匹配
    text = text.replaceAll("\s\r\n","Jacck");
    text = text.replaceAll("\n|\r",""); //处理掉被强行加上来的回车换行符
    text = text.replaceAll("Jacck"," ");

    return text;
    // stripper.writeText(document, output);
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    if(document != null){
    document.close();
    }
    }
    return "";
    }

    之后再python中使用pdfminer也实现了同样的消除pdf大量换行问题,替换核心代码如下,不同的是python三方包在处理pdf后换行不是 而是

    re是python中的正则表达式,transfered_str是pdf处理后的字符串,与上边java中用的思想一样。

    transfered_str = re.sub(r'
    s', 'Jacck', transfered_str)
    transfered_str = re.sub(r's
    ', 'Jacck', transfered_str)
    transfered_str = re.sub(r'
    |
    ', '', transfered_str)
    transfered_str = re.sub(r's{4,}', '
    ', transfered_str)
    transfered_str = re.sub(r'Jacck',' ',transfered_str

      

  • 相关阅读:
    Hbase基础(十七):亿级数据从 MySQL 到 Hbase 的三种同步方案与实践(一)环境搭建
    Hbase基础(十六):扩展
    离线电商数仓(十九)之电商数据仓库系统(二)数仓分层
    离线电商数仓(十八)之电商数据仓库系统(一)数仓分层
    离线电商数仓(十七)之系统业务数据仓库数据采集(四)数据环境准备
    离线电商数仓(十六)之系统业务数据仓库数据采集(三)业务数据采集模块(二)
    离线电商数仓(十五)之系统业务数据仓库数据采集(二)业务数据采集模块(一)
    Linux ioctl调用
    dpdk Vhost 库
    vhost 控制平面 + handle_kick + VhostOps
  • 原文地址:https://www.cnblogs.com/Jacck/p/7827127.html
Copyright © 2011-2022 走看看