/
javapractice
/
JavaPractice
Обзор
Документация
Войти
/
javapractice
/
JavaPractice
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
2
CI/CD
Аналитика
develop
ApachePOI/src/main/java/utils/PriceGetterT2.java
137 строк
6 KB
Zexa91x0
Apache POI - PriceGetterT2
30 май 2021, 20:52
30 май 2021, 20:52
258db9c
Код
Авторство
О чём код?
package utils; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfTextExtractor; import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy; import com.itextpdf.text.pdf.parser.TextExtractionStrategy; import java.io.File; import java.io.IOException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; public class PriceGetterT2 extends PriceGetterFromFile { public PriceGetterT2() { } public PriceGetterT2(File file) throws IOException { tryToLoadDataFromFile(file); } @Override public Map<Long, Double> tryToLoadDataFromFile(File file) throws IOException { getPriceMapFromPDF(file.getAbsolutePath()) .forEach(this::putPrice); return getPriceMap(); } /** * Метод получения Map <Номер, Прайс> из PDF файла * * @param fileName передать в метод название файла. * @throws IOException когда чтение из файла не возможно */ private Map<Long, Double> getPriceMapFromPDF(String fileName) throws IOException { if (fileName.isEmpty()) throw new IllegalArgumentException("Не указан путь к файлу"); if (!(new File(fileName).canRead())) throw new IllegalArgumentException("Нет доступа к файлу: " + fileName); PdfReader reader = new PdfReader(fileName); TextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); String text = null; // не забываем, что нумерация страниц в PDF начинается с единицы. int i = 1; // перебираем все страницы в PDF документе while (i <= reader.getNumberOfPages()) { // записываем очередную страницу из PDF в строку text = PdfTextExtractor.getTextFromPage(reader, i, strategy); // счетчик страниц ++i; } // System.out.println(text); // получаем номера с листа PDF List<Long> numbersList = new ArrayList<>(getNumbersList(text)); // сохраняем в лист // получаем суммы для номеров из подстрок строки с листа PDF List<Double> pricesLists = new ArrayList<>(getPrices(text)); // проверяем чтобы количество полученных значений для номеров и сумм совпадало. if (numbersList.size() != pricesLists.size()) throw new IllegalArgumentException("количество полученных номеров не соответствует количеству сумм"); // получаем Мap из листов Map<Long, Double> resultMap = new HashMap<>(); while (!numbersList.isEmpty()) { resultMap.put(numbersList.remove(0), pricesLists.remove(0)); } // убираем за собой reader.close(); return resultMap; } /** * Метод получения List <Номер> * * @param text строка всех данных импортированная из PDF файла * @return List <Номер> */ private List<Long> getNumbersList(String text) { // делим строку листа PDF на подстроки String[] lines = text.split("\\r?\\n"); // паттерн выделения номера из подстроки вида "Абонент 79519615255 Мой бизнес S (Ханты-Мансийск NEW)" Pattern patternNumber = Pattern.compile("Абонент (\\d+) \\D*"); return Arrays.stream(lines) .filter(s -> s.contains("Абонент")) // выбираем все строки где есть "Абонент" .map(s -> { // выдергиваем подстроку - номер Matcher m1 = patternNumber.matcher(s); if (m1.matches()) return m1.group(1); else return "0"; }) .map(s -> s.substring(1)) // убираем первую 7 из номера .map(Long::valueOf) // String to Long .collect(Collectors.toList()); } /** * Метод получения List <Цена> * * @param text строка всех данных импортированная из PDF файла * @return List <Цена> */ private static List<Double> getPrices(String text) { // делим строку листа PDF на подстроки String[] lines = text.split("\\r?\\n"); // паттерн выделения суммы из подстроки вида "Абонплата 1 800,00 руб" Pattern patternPrice = Pattern.compile("([0-9]*\\s*[0-9]+\\,*[0-9]*) руб"); return Arrays.stream(lines) .filter(s -> {// выбираем все подстроки формата "250,00 руб" Matcher m1 = patternPrice.matcher(s); return (m1.matches()); }) .map(s -> { // выдергиваем подстроку - сумму Matcher m2 = patternPrice.matcher(s); if (m2.matches()) return m2.group(1); else return "0"; }) .map(s -> s.replaceAll("\\s+", "")) // удаляем пробел если есть .map(s -> s.replaceAll(",", ".")) .map(Double::valueOf) // String to Long .collect(Collectors.toList()); } }