Как получить строку между двумя строками с разными индексами в каждом файле PDF, используя Java - PullRequest
0 голосов
/ 17 июня 2020

enter image description here

У меня есть более 200 файлов отчетов в формате PDF, в которых мне нужно получить VIN # и номер дела из каждого отчета, а затем переименовать отчет с VIN + Case # .pdf.

Что касается VIN #, его было легко получить, поскольку он всегда расположен в начале страницы, а VIN имеет фиксированную длину, которая составляет 17 символов.

У меня проблема с номером дела, когда я не могу получить точное число, поскольку индекс «Номер дела» получает изменения от одного отчета к другому в зависимости от количества слов в каждой ячейке, стоящей перед " Номер дела ».

Мой вопрос: как я могу сказать java дать мне строку, которая находится между двумя пробелами, одна из которых идет после« Номер дела », а вторая стоит перед ячейкой «Системный ключ»

Я попытался разбить все слова пробелами, и я застрял с лог c того, как действительно получить это определенное c число, несмотря на его порядковый номер.

ПРИМЕЧАНИЕ: Номер дела всегда разный, и его длина тоже не одинакова

Вот что у меня есть на данный момент:

    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");
            }
        }
        }
}

Ответы [ 2 ]

1 голос
/ 18 июня 2020
/*
 * import java.util.regex.Pattern;
 * import java.util.regex.Matcher;
 */
String text = pdfStripper.getText(document); // Retrieving text from PDF document
Pattern pattern = Pattern.compile("Case Number\\s+(\\d+)\\s"); // this is the regex
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    System.err.println(""Case Number is ==> " + matcher.group(1));
}

Части регулярного выражения из приведенного выше кода:

  1. Case Number - литерал, т.е. поиск по этой точной строке.
  2. \\s+ - один или несколько последовательных пробелов
  3. \\d+ - одна или несколько цифр
  4. \\s - один пробел

Итак, приведенный выше код ищет в тексте, извлеченном из вашего PDF-документа, строку Case Number, за которой следует один или несколько пробелов, за которыми следует число.

Если регулярное выражение найдено, с помощью кода matcher.find(1) извлекается только число.

См. Эту веб-страницу:

https://docs.oracle.com/javase/tutorial/essential/regex/

0 голосов
/ 18 июня 2020

Мне удалось найти решение, которое выглядит следующим образом: я разделил текст пробелами, а затем заменил номер дела на номер дела, чтобы я мог выделить красным цветом пространство между словами «Дело» и «Число». ". Затем я сделал несколько логи c следующим образом:

            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");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...