java递归遍历pdf并提取字符批量修改文件名

目标:
假设工作场景,这里有几百上千张网约车电子发票或者其它文件,需要你按照某种规则重新命名后再提交,显然人工去做费时费力。这么繁琐的工作当然应该用程序做。
具有较高使用价值,可根据自己需求 拓展改编灵活应用。

任务:利用Java语言 读取指定目录下所有得pdf文件(电子发票),提取子字符串得到合计总价(命名规则需要 员工编号+总价);
根据命名规则 设置新名字字符串,file类重新命名

第一步:

读取pdf:
请看这个:使用spire.pdf 注册并下载压缩包 找到jar包导入项目中即可
(4条消息) Java 读取PDF文本内容_Eiceblue的专栏-CSDN博客_java读取pdf内容

读取pdf文件 获取字符串

public static StringBuffer readOnePDF(File fi) {
        //创建pdf对象实例
        PdfDocument doc = new PdfDocument();
        //读取文件
        doc.loadFromFile(fi.getAbsolutePath());
        PdfPageBase pdfPageBase;//页面
        StringBuffer buffer = new StringBuffer();
        //遍历pdf文件所有页面 获取文本存入字符串
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            //提取内存  加入字符串
            pdfPageBase = doc.getPages().get(i);
            buffer.append(pdfPageBase.extractText(true));
        }
//        System.out.println("读取完毕!");
//        System.out.println(buffer);
//        System.out.println("提取总计:");
        System.out.println("\n成功提取出该发票文件的总价为-->"+extractSumofMoney(buffer));
        return buffer;
    }

第二步:获取总价

//从字符串中提取出总价数字 返回 传递buffer字符串
    public static StringBuffer extractSumofMoney(StringBuffer buffer) {

        StringBuffer sumStr = new StringBuffer();
        //判断方法  获取子字符串“(小写)¥”下标   往后挨个判断 如果是数字 则加入字符串
        int index = buffer.indexOf("(小写)¥");
        index += 5;
        while (index < buffer.length()) {
            char it = buffer.charAt(index);
            if (Character.isDigit(it) || it == '.') {
                sumStr.append(it);
                index++;
            } else {
                break;
            }

        }

        //转换字符串内容为double
        Double sum = new Double(sumStr.toString());
//        System.out.println("总计:" + sum);
        return sumStr;

    }

第三步:递归遍历文件,重新命名

//递归遍历指定文件夹(默认全是pdf或子文件夹 文件夹里面)  调用函数 读取pdf;调用函数 获取总价返回;递归遍历所有文件  根据规则 重命名
    public static void RecursionDir(String filepath) {
        //
        File dir = new File(filepath);
        File[] list = dir.listFiles();
        System.out.println("总共" + list.length + "个文件:");
        if (list != null && list.length > 0) {

            for (File fi : list) {

                if (fi.isDirectory()) {
                    RecursionDir(fi.getAbsolutePath());//健壮性:如果有子文件夹 对里面继续改名字 增强适用性
                } else {//如果是文件  则读取

                    StringBuffer buffer = readOnePDF(fi);
                    //得到该文件总价格
                    String sumStr = new String(extractSumofMoney(buffer));
                    //设置 新名字  按照规则:我这里是   w编号+金额;
                    String newName = "\\W1120+" + sumStr + ".pdf";
                    /*
                    修改文件名字
                     */
                    System.out.println("文件是否真实存在磁盘上?" + fi.exists());
                    File newFileName = new File(filepath + newName);
                    System.out.print("旧文件的原来名字:" + fi.getName() + "------");
                    System.out.println("新文件的目标名字: " + newFileName.getName());
                    if (newFileName.exists()) {
                        //遇到相同的 就不改名字了
                        System.out.println("新名字已经存在了: " + newFileName.getName() + "  为防止系统错误  暂不命名");

                    } else {
                        if (fi.renameTo(newFileName)) {
                            System.out.println("成功设置新命名为-->" + newFileName.getName());
                        }
                    }

                }


            }
        }

    }

效果图:

旧文件:含子文件夹


image.png

代码执行后
新文件:


image.png

子文件里面同样修改了:


image.png
image.png

全部代码:

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.sun.javafx.scene.layout.region.Margins;
import com.sun.xml.internal.ws.commons.xmlutil.Converter;

import java.io.File;


public class RenamePDF {

    public static StringBuffer readOnePDF(File fi) {
        //创建pdf对象实例
        PdfDocument doc = new PdfDocument();
        //读取文件
        doc.loadFromFile(fi.getAbsolutePath());
        PdfPageBase pdfPageBase;//页面
        StringBuffer buffer = new StringBuffer();
        //遍历pdf文件所有页面 获取文本存入字符串
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            //提取内存  加入字符串
            pdfPageBase = doc.getPages().get(i);
            buffer.append(pdfPageBase.extractText(true));
        }
//        System.out.println("读取完毕!");
//        System.out.println(buffer);
//        System.out.println("提取总计:");
        System.out.println("\n成功提取出该发票文件的总价为-->" + extractSumofMoney(buffer));
        return buffer;
    }

    //从字符串中提取出总价数字 返回 传递buffer字符串
    public static StringBuffer extractSumofMoney(StringBuffer buffer) {

        StringBuffer sumStr = new StringBuffer();
        //判断方法  获取子字符串“(小写)¥”下标   往后挨个判断 如果是数字 则加入字符串
        int index = buffer.indexOf("(小写)¥");
        index += 5;
        while (index < buffer.length()) {
            char it = buffer.charAt(index);
            if (Character.isDigit(it) || it == '.') {
                sumStr.append(it);
                index++;
            } else {
                break;
            }

        }

        //转换字符串内容为double
        Double sum = new Double(sumStr.toString());
//        System.out.println("总计:" + sum);
        return sumStr;

    }


    //递归遍历指定文件夹(默认全是pdf或子文件夹 文件夹里面)  调用函数 读取pdf;调用函数 获取总价返回;递归遍历所有文件  根据规则 重命名
    public static void RecursionDir(String filepath) {
        //
        File dir = new File(filepath);
        File[] list = dir.listFiles();
        System.out.println("总共" + list.length + "个文件:");
        if (list != null && list.length > 0) {

            for (File fi : list) {

                if (fi.isDirectory()) {
                    RecursionDir(fi.getAbsolutePath());//健壮性:如果有子文件夹 对里面继续改名字 增强适用性
                } else {//如果是文件  则读取

                    StringBuffer buffer = readOnePDF(fi);
                    //得到该文件总价格
                    String sumStr = new String(extractSumofMoney(buffer));
                    //设置 新名字  按照规则:我这里是   w编号+金额;
                    String newName = "\\W1120+" + sumStr + ".pdf";
                    /*
                    修改文件名字
                     */
                    System.out.println("文件是否真实存在磁盘上?" + fi.exists());
                    File newFileName = new File(filepath + newName);
                    System.out.print("旧文件的原来名字:" + fi.getName() + "------");
                    System.out.println("新文件的目标名字: " + newFileName.getName());
                    if (newFileName.exists()) {
                        //遇到相同的 就不改名字了
                        System.out.println("新名字已经存在了: " + newFileName.getName() + "  为防止系统错误  暂不命名");

                    } else {
                        if (fi.renameTo(newFileName)) {
                            System.out.println("成功设置新命名为-->" + newFileName.getName());
                        }
                    }

                }


            }
        }

    }

    public static void main(String[] args) {

        RecursionDir("D:\\*****\\电子发票\\*****\\2021");
    }
}




你可能感兴趣的:(java递归遍历pdf并提取字符批量修改文件名)