String strengthRank1 = "";
String strengthRank2 = "";
String weaknessRank1 = "";
String weaknessRank2 = "";
if (document.getNumberOfPages() > 1) {
PDPage page = document.getPage(1);
float width = page.getCropBox().getWidth();
float height = page.getCropBox().getHeight();
PDFTextStripperByArea area = new PDFTextStripperByArea();
area.setSortByPosition(true);
// 2페이지 아래쪽 70%
float startY = height * 0.30f;
float margin = 20f;
float tableWidth = width - margin * 2;
// 왼쪽 30%: 순위와 항목명
// 오른쪽 70%: Q1으로 시작하는 설명
float leftWidth = tableWidth * 0.30f;
area.addRegion("left", new Rectangle2D.Float(
margin,
startY,
leftWidth,
height - startY - margin
));
area.addRegion("right", new Rectangle2D.Float(
margin + leftWidth,
startY,
tableWidth - leftWidth,
height - startY - margin
));
area.extractRegions(page);
String leftText = area.getTextForRegion("left");
String rightText = area.getTextForRegion("right");
// 왼쪽에서 순위별 항목명 네 개 추출
List<String> ranks = extractRanks(leftText);
// 오른쪽에서 Q1으로 시작하는 설명 네 개 추출
List<String> descriptions = extractDescriptions(rightText);
if (ranks.size() != 4 || descriptions.size() != 4) {
throw new IllegalArgumentException(
"2페이지 추출 실패: 순위 "
+ ranks.size() + "개, 설명 "
+ descriptions.size() + "개"
);
}
strengthRank1 = ranks.get(0) + " " + descriptions.get(0);
strengthRank2 = ranks.get(1) + " " + descriptions.get(1);
weaknessRank1 = ranks.get(2) + " " + descriptions.get(2);
weaknessRank2 = ranks.get(3) + " " + descriptions.get(3);
}
// 왼쪽: 1순위, 2순위, 1순위, 2순위
private List<String> extractRanks(String text) {
List<String> result = new ArrayList<>();
Matcher matcher = Pattern.compile(
"(?s)([12]\\s*순위\\s*.*?)" +
"(?=[12]\\s*순위|$)"
).matcher(text);
while (matcher.find()) {
result.add(
matcher.group(1)
.replaceAll("\\s+", " ")
.trim()
);
}
return result;
}
// 오른쪽: Q1으로 시작하는 설명 네 개
private List<String> extractDescriptions(String text) {
List<String> result = new ArrayList<>();
Matcher matcher = Pattern.compile(
"(?is)(Q\\s*1\\b.*?)" +
"(?=Q\\s*1\\b|$)"
).matcher(text);
while (matcher.find()) {
result.add(
matcher.group(1)
.replaceAll("\\s+", " ")
.trim()
);
}
return result;
}