[Spring] PDFBox 로 텍스트 추출시 null 값이 추출될 때

2024. 10. 10. 15:08·개발 ━━━━━/Spring(boot)
반응형

문제

PDFBox 를 이용해서 이력서 형식의 PDF (잡코리아, 사람인) 에 있는 텍스트를 출력하는데

public String extractPDF(MultipartFile file) {
        try (PDDocument document = PDDocument.load(file.getInputStream())) {
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setSortByPosition(true);
            String content = stripper.getText(document);
            }
        catch {
        }

 

잡코리아는 null 문자 없이 정상적으로 출력이 되지만

사람인은 ~ (tilde) 와 - (dash) 출력시 지원이 안되는 폰트인지 null 로 출력이 되었다.

Intellij 콘솔창
Postman 콘솔창

 

stripper.setAddMoreFormatting(true);

 

더 많은 포맷을 지원하게끔 하는 옵션이 있다하여 추가해봤지만 결과는 똑같았다.

 

콘솔 창의 텍스트를 그대로 복사해서 메모장 같은데에 붙여 넣었더니

010 XXXX XXXX

2024.01   2024.02 (공백 3개)

와 같이 출력 되어서 이에 맞춰서 정규식을 여러 개 작성해보았지만

아무리 데이터를 추출해보려해도 Matcher 가 찾지 못해서 db 에 데이터가 들어가질 않았다.

 

해결

별의별 정규식을 작성을 해보다가 문득 db 에는 어떤 식으로 저장이 되는지 궁금하여 정규식 전체를 저장하는

이메일\\s+(.*)

 

와 같이 작성하여 전체 줄이 들어가게끔 하였고 db 에서 확인을 해보니

010\\0XXXX\\0XXXX

처럼 저장이 되는 것을 확인하였다.

 

콘솔 창에서 복사를 했을 땐 같은 띄어쓰기로 표현이 되었지만

db 에는 다른 형식으로 저장이 되고 있었다.

 

\\0 을 반영하여 정규식 패턴을

Pattern contactPattern = Pattern.compile(".*?(010\\x00\\d{4}\\x00\\d{4}).*");
Pattern degreePattern = Pattern.compile("(\\d{4}\\.\\d{2}\\s*\\x00\\s*\\d{4}\\.\\d{2})\\s*([^\\s]+)\\s+(.+?)$");

 

처럼 작성하니 Matcher 가 패턴을 찾았고 데이터가 정상적으로 저장이 되었다.

 


여기까지 하면 데이터는 정상적으로 저장이 되지만 테이블을 보면

010 XXXX XXXX

2024.01   2024.02

등으로 저장이 된다.

 

잡코리아 이력서에서 출력되는 형식과 동일하게 만들기 위해

 

public String cleanNullCharacter(String input, boolean dashOrTilde, boolean isJobKorea) {
        String result = input.replaceAll("\\x00", dashOrTilde ? "-" : "~");
        if(!dashOrTilde && !isJobKorea){
            result = result.replaceAll("\\.", "\\. ");
        }
        return result.trim();
    }

 

와 같은 함수를 작성해서

사람인 이력서일 때 휴대폰 번호면 dash, 기간이면 tilde 로 대체하게끔 하였다!

반응형

'개발 ━━━━━ > Spring(boot)' 카테고리의 다른 글

[Spring] Singleton, Prototype Scope Bean  (1) 2024.09.06
[Spring] 이전 데이터를 불러올때 stream문과 for문의 성능 차이 테스트 - 1  (0) 2023.11.18
[Spring] WebSocket 을 이용한 채팅 구현  (1) 2023.10.09
[Spring] Entity 관계  (0) 2023.09.02
[Spring] Filter  (0) 2023.09.01
'개발 ━━━━━/Spring(boot)' 카테고리의 다른 글
  • [Spring] Singleton, Prototype Scope Bean
  • [Spring] 이전 데이터를 불러올때 stream문과 for문의 성능 차이 테스트 - 1
  • [Spring] WebSocket 을 이용한 채팅 구현
  • [Spring] Entity 관계
GukJang
GukJang
•  ⌘ ⌥ •
    반응형
  • GukJang
    SPACE
    GukJang
  • 전체
    오늘
    어제
    • Blog (73)
      • 개발 ━━━━━ (68)
        • Java (14)
        • C++ (1)
        • HTML (1)
        • Spring(boot) (7)
        • Dev (9)
        • SQL (1)
        • CS (2)
        • Git (1)
        • Troubleshoot (14)
        • Algorithm (2)
        • Definition (1)
        • Dev Life (2)
        • TIL (7)
        • 항해 (6)
      • 공돌 ━━━━━ (4)
        • 플젝 (2)
        • 장비 (1)
        • 부품 (1)
      • 독서 ━━━━━ (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    micropython
    AWS
    Python
    마이크로파이썬
    사전 스터디
    자바
    EC2
    mysql
    SpringBoot
    electron-builder
    github actions
    항해99
    오픈소스 기여
    Java
    spring
    docker volume
    CI CD
    백준
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
GukJang
[Spring] PDFBox 로 텍스트 추출시 null 값이 추출될 때
상단으로

티스토리툴바