如何使用Java在每个pdf文件中具有不同索引的两个字符串之间获取字符串
我有200多个pdf报告文件,我需要从每个报告中获取VIN和案例编号,然后用VIN+Case.pdf重命名报告 对于VIN#,很容易获取它,因为它始终位于页面的开头,并且VIN的固定长度为17个字符 我对案例编号有一个问题,我无法得到确切的数字,因为“案例编号”的索引根据“案例编号”单元格前面每个单元格中的字数从一个报告到另一个报告的变化 我的问题是:如何告诉java给我两个空格之间的字符串,其中一个位于“Case Number”之后,第二个位于单元格“System Key”之前 我试着用空格来分割所有的单词,我陷入了一种逻辑,即如何真正得到那个特定的数字,尽管它的索引号是多少 注意:案例编号始终不同,其长度也不相同 以下是我到目前为止的情况:如何使用Java在每个pdf文件中具有不同索引的两个字符串之间获取字符串,java,string,Java,String,我有200多个pdf报告文件,我需要从每个报告中获取VIN和案例编号,然后用VIN+Case.pdf重命名报告 对于VIN#,很容易获取它,因为它始终位于页面的开头,并且VIN的固定长度为17个字符 我对案例编号有一个问题,我无法得到确切的数字,因为“案例编号”的索引根据“案例编号”单元格前面每个单元格中的字数从一个报告到另一个报告的变化 我的问题是:如何告诉java给我两个空格之间的字符串,其中一个位于“Case Number”之后,第二个位于单元格“System Key”之前 我试着用空格来
package Read_Pdf_AsA_Text;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class GetVinAndCaseNum {
public static void main(String args[]) throws IOException {
File folder = new File("C:\\Users\\" + System.getProperty("user.name") + "\\Desktop\\Tasks\\test\\");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
File f = new File("C:\\Users\\" + System.getProperty("user.name") + "\\Desktop\\Tasks\\test\\"+listOfFiles[i].getName());
PDDocument document = PDDocument.load(f);
PDFTextStripper pdfStripper = new PDFTextStripper(); // Instantiate PDFTextStripper class
String text = pdfStripper.getText(document); // Retrieving text from PDF document
System.out.println(text);
if (text.contains("VIN")) {
int vinIndexIs = text.indexOf("VIN");
int newVINIndex = vinIndexIs + 3;
String vinNum = text.substring(newVINIndex, newVINIndex + 19);
System.err.println("New VIN is ===> " + vinNum);
}
int caseNo = 0;
if (text != null) {
String[] spcase = text.split(" ");
System.out.println("spaces ==> " + spcase);
boolean foundCaseNumber = false;
for (String stringAfterSpace : spcase) {
System.out.println("stringAfterSpace ==> " + stringAfterSpace);
if(foundCaseNumber) {
caseNo = Integer.parseInt(stringAfterSpace.trim());
System.out.println("caseNo ==> " + caseNo);
break;
}
if("Case Number".equals(stringAfterSpace)) {
System.out.println("Case Number issss ===> " + stringAfterSpace);
foundCaseNumber = true;
}
}
if(caseNo == 0) {
System.out.println("Case No. not found.");
}
}
document.close();
System.out.println("conversion is done");
}
}
}
}
package Read\u Pdf\u AsA\u Text;
导入java.io.File;
导入java.io.IOException;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.text.PDFTextStripper;
公共类GetVinAndCaseNum{
公共静态void main(字符串args[])引发IOException{
文件夹=新文件(“C:\\Users\\”+System.getProperty(“user.name”)+“\\Desktop\\Tasks\\test\\”;
File[]listOfFiles=folder.listFiles();
for(int i=0;i”+vinNum);
}
int caseNo=0;
如果(文本!=null){
String[]spcase=text.split(“”);
System.out.println(“空格==>”+spcase);
布尔值foundCaseNumber=false;
for(字符串stringAfterSpace:spcase){
System.out.println(“stringAfterSpace==>”+stringAfterSpace);
if(案例编号){
caseNo=Integer.parseInt(stringAfterSpace.trim());
System.out.println(“caseNo==>”+caseNo);
打破
}
如果(“案例编号”。等于(stringAfterSpace)){
System.out.println(“案例编号issss===>”+stringAfterSpace);
foundCaseNumber=true;
}
}
如果(caseNo==0){
System.out.println(“未找到案例编号”);
}
}
document.close();
System.out.println(“转换完成”);
}
}
}
}
我找到了如下解决方案:
我用空格分隔文本,然后用casenamber替换casenamber,这样我就可以在单词“Case”和“Number”之间的空格处涂上红色。然后我做了如下逻辑:
String caseNum = "";
if (text != null) {
String[] spcase = text.replace("Case Number", "CaseNumber").split(" ");
boolean foundCaseNum = false;
for (String stringAfterSpace : spcase) {
if(foundCaseNum) {
caseNum = stringAfterSpace.trim();
System.err.println("Case Number is ==> " + caseNum);
break;
}
if(stringAfterSpace.contains("CaseNumber")) {
foundCaseNum = true;
}
}
if(caseNum.isEmpty()) {
System.out.println("Case No. not found.");
}
}
document.close();
System.out.println("conversion is done");
}
/*
*导入java.util.regex.Pattern;
*导入java.util.regex.Matcher;
*/
String text=pdfStripper.getText(文档);//从PDF文档检索文本
Pattern=Pattern.compile(“案例编号\\s+(\\d+\\s”);//这是正则表达式
Matcher Matcher=pattern.Matcher(文本);
if(matcher.find()){
System.err.println(““案例编号为==>”+matcher.group(1));
}
上述代码中的部分正则表达式:
案例编号
-文本,即搜索此精确字符串\\s+
-一个或多个连续空格\\d+
-一个或多个数字\\s
-单个空格Case Number
,后跟一个或多个空格,后跟一个数字
如果找到正则表达式,只需通过codematcher.find(1)
提取数字即可
请参阅此网页:
如果有什么不清楚的地方,请告诉我,以便我可以澄清,也许你应该使用?@Abra我以前没有使用正则表达式,你知道我如何在这里实现它们吗。谢谢你的回答。也许页面布局可以帮到忙。试着找到周围包含“案例编号”和“系统密钥”的两个框“然后得到坐标。然后找到中间的所有盒子,并采取text@MarcStr欧贝尔:谢谢你的建议。这就是我在两天多的时间里一直在努力实现的目标。如果可能的话,我正在寻求帮助。非常感谢你的回答,我在发布我的答案后看到了。但我肯定会试试你贴的那张。非常感谢。再次感谢你