문제
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 로 출력이 되었다.
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 (0) | 2024.09.06 |
---|---|
[Spring] 이전 데이터를 불러올때 stream문과 for문의 성능 차이 테스트 - 1 (0) | 2023.11.18 |
[Spring] WebSocket 을 이용한 채팅 구현 (0) | 2023.10.09 |
[Spring] Entity 관계 (0) | 2023.09.02 |
[Spring] Filter (0) | 2023.09.01 |