본문 바로가기

학습/Java_Spring

java로 한글(HWP)파일 읽어서 출력하기

https://github.com/neolord0/hwplib

 

GitHub - neolord0/hwplib: hwp library for java

hwp library for java. Contribute to neolord0/hwplib development by creating an account on GitHub.

github.com

 

hwplib 을 이용해서 파일의 표을 읽어 콘솔로 출력하는 코드

 

필요한 데이터들이 표로 작성되어 있어서 표에서 긁어오는 코드를 위주로 작성했는데,

다양한 문서 내용을 git의 sample 에서 확인 할 수 있다.

 

실행은 코드에서 main 부분을 실행하는 형태로 했었는데,

sample에서 실행해보려니 빌드 에러 발생부터 잡아야해서

기존에 만들었던 코드에서 표 읽는 부분만 sample 코드로 다시 정리했다.

 

 

1. 출력결과

오후 6:17:25: Executing ':HwpReaderExample.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :HwpReaderExample.main()
========== 학생 성적표 ==========
번호
 | 이름
 | 수학
 | 영어
 | 과학
 | 
1
 | 철수
 | 85
 | 90
 | 95
 | 
2
 | 영희
 | 88
 | 92
 | 89
 | 
3
 | 민수
 | 92
 | 85
 | 90
 | 
4
 | 지혜
 | 90
 | 93
 | 88
 | 

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.4/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 609ms
2 actionable tasks: 2 executed
오후 6:17:26: Execution finished ':HwpReaderExample.main()'.


 

 

2. main 코드

package org.example;

import kr.dogfoot.hwplib.object.HWPFile;
import kr.dogfoot.hwplib.object.bodytext.Section;
import kr.dogfoot.hwplib.object.bodytext.control.Control;
import kr.dogfoot.hwplib.object.bodytext.control.ControlTable;
import kr.dogfoot.hwplib.object.bodytext.control.ControlType;
import kr.dogfoot.hwplib.object.bodytext.control.table.Cell;
import kr.dogfoot.hwplib.object.bodytext.control.table.Row;
import kr.dogfoot.hwplib.object.bodytext.paragraph.Paragraph;
import kr.dogfoot.hwplib.reader.HWPReader;
import kr.dogfoot.hwplib.tool.objectfinder.ControlFilter;
import kr.dogfoot.hwplib.tool.objectfinder.ControlFinder;

import java.io.IOException;
import java.util.ArrayList;

public class HwpReaderExample implements ControlFilter {

    @Override
    public boolean isMatched(Control control, Paragraph paragraph, Section section) {
        return control.getType() == ControlType.Table;
    }

    public void readAndPrintTable(String filePath) {
        try {
            HWPFile hwpFile = HWPReader.fromFile(filePath);
            if (hwpFile != null) {
                ArrayList<Control> result = ControlFinder.find(hwpFile, this);
                if (result != null && !result.isEmpty()) {
                    Control control = result.get(0); // 첫 번째 테이블 가져오기
                    ControlTable table = (ControlTable) control;

                    System.out.println("========== 학생 성적표 ==========");
                    for (Row row : table.getRowList()) {
                        for (Cell cell : row.getCellList()) {
                            System.out.print(cell.getParagraphList().getNormalString() + " | ");
                        }
                        System.out.println();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        HwpReaderExample hwpReader = new HwpReaderExample();
        String filePath = "./doc/학생 성적표.hwp"; // 예시 파일 경로
        if (hwpReader.isHwpFile(filePath)) {
            hwpReader.readAndPrintTable(filePath);
        } else {
            System.out.println("확장자가 hwp나 hwpx가 아닌 파일은 실행할 수 없습니다: " + filePath);
        }
    }

    public boolean isHwpFile(String filename) {
        String extension = "";
        int lastDotIndex = filename.lastIndexOf('.');
        if (lastDotIndex > 0) {
            extension = filename.substring(lastDotIndex + 1);
        }
        return extension.equalsIgnoreCase("hwp") || extension.equalsIgnoreCase("hwpx");
    }
}

 

 

 

3. gradle 

plugins {
    id 'java'
}

group = 'org.example'
version = '1.0-SNAPSHOT'

java {
    sourceCompatibility = '1.8'
}

repositories {
    mavenCentral()
}

dependencies {
    // hwp reader를 위한 Apach POI
    // https://archive.apache.org/dist/poi/release/bin/ 에서 수동으로 받아서 설치해야만 HWPF 가 있음.
    // hwpf 가 있어야만, hwp 파일을 read 할 수 있는데, apache 에서 폐기했기 때문에 접근 방식이 너무 좋지 않아서 다른 lib를 찾기를 시도함.
//    implementation 'org.apache.poi:poi:3.17'
//    implementation 'org.apache.poi:poi-ooxml:3.17'

    // HwpTableReader 개발
    // https://mvnrepository.com/artifact/kr.dogfoot/hwplib
    implementation 'kr.dogfoot:hwplib:1.1.4'

    // csv 파일 저장
    implementation 'com.opencsv:opencsv:5.5.2'


    testImplementation platform('org.junit:junit-bom:5.9.1')
    testImplementation 'org.junit.jupiter:junit-jupiter'
}

test {
    useJUnitPlatform()
}