카테고리 없음

ㅎㅎㅎ

sofiaaa 2026. 9. 30. 10:53
반응형


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

반응형