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