글머리표가 2개 이상일때 문단모양정보(getParaShapeList)가 사라지는 현상 관련 확인요청사항
Closed this issue · 9 comments
안녕하세요!
이전에 제가 질문드렸던 글머리표가 2개 이상일때 문단모양정보(getParaShapeList)가 사라지는 현상과 관련해서
제가 소스를 한번 수정해서, 일단 제가 가진 hwp문서로 테스트 했을때는 문제가 없었는데,
혹시 다른 문제가 없을지 확인 부탁드립니다.
주요 수정내용은 RecordHeader가 확장레코드 구조일 경우, 85bytes를 skip하게 수정하였습니다.
아래 수정된 소스 참조
[ docinfo 클래스 ]
public void read(DocInfo di, StreamReader sr) throws Exception {
this.sr = sr;
this.docInfo = di;
//글머리표(bullet)이 들어갈때는 레코드구조가 기본레코드 구조가 아니라,
//확장레코드구조가 되므로 StreamReader에서 문서의 bullet 건수를 확인하기 위해
// docinfo를 세팅함
sr.setDocInfo(di);
while (sr.isEndOfStream() == false) {
sr.readRecordHeader();
recordBody();
}
}
[ StreamReader 클래스 ]
public RecordHeader readRecordHeader() throws IOException {
if (isEndOfStream()) {
header.setTagID((short) 0);
header.setLevel((short) 0);
header.setSize((short) 0);
} else {
//일반적인 데이터 구조 - 헤더(DWORD) + 데이터
//레코드 헤더의 크기는 32bits이고 TagID(10bits), Level(10bits), Size(12bits)로 구성됨
long value = readUInt4();
header.setTagID((short) BitFlag.get(value, 0, 9));
header.setLevel((short) BitFlag.get(value, 10, 19));
header.setSize((short) BitFlag.get(value, 20, 31));
if (header.getSize() == 4095) {
//데이터구조가 헤더(DWORD) + 길이(DWORD) + 데이터 로 구성됨
header.setSize(readUInt4());
//압축된 파일형식인 경우, 확장레코드 구조에서 길이(DWORD)값이 실제 데이터 크기와 맞지 않아서
//(글머리표 건수(BulletCount) -1) * 85 만큼 데이터를 Skip한다. 글머리표가 1개만 사용될 경우는 확장레코드가 아님
skip((this.docInfo.getIDMappings().getBulletCount() - 1) * 85);
}
}
readAfterHeader = 0;
return header;
}
if (header.getSize() == 4095) {} 안에..
skip((this.docInfo.getIDMappings().getBulletCount() - 1) * 85); 이 들어간 이유가 뭔가요?
어떤 레코드도 size가 4095 일 수 있는데.. 그 때마다 skip()이 호출되면..당연히 문제가 생기겠죠..
확장레코드 구조에 있는 길이(DWORD)값으로 skip처리하려고 했는데,
이 DWORD값을 long형태로 변환하면, 엄첨 큰 숫자가 되어 실제 데이터사이즈를 체크할 수가 없어서,
그렇다고 compress된 데이터를 압축해제 해서 다시 읽을 수도 없고 해서
일반적으로 글머리표인 경우, 확장레코드 구조 형식일 경우, 데이터사이즈가 85byte가 되어서 그렇게 처리한 것입니다.
혹시, 기본데이터 구조 정보에 있는 tagID를 가지고, 현재 문단 header가 글머리표인지를 확인할 수는 없나요?
지금 size가 4096 보다 큰 레코드(확장레코드??) 들은 이미 처리되고 있습니다.
현재 코드에서 읽지 못 한다면..HWP 파일을 보내주세요.
이 부분에 엄청 큰 숫자가 읽히면.. 앞쪽에 Record을 잘 못 읽었을 수 있습니다.
지난번에 보내드렸던 파일과 같은 파일입니다....
매뉴얼_정기예금(글머리).zip
파일을 읽는 부분은 문제가 없는데..
왜 read 부분을 수정하셨나요?
이 파일을 읽으면, 다음의 정보가 저장되지 않는 현상이 나와서 그렇습니다.
DocInfo.getParaShapeList() 문단모양
DocInfo.getStyleList() 스타일
DocInfo.getNumberingLIst() 문단 번호
DocInfo.getBulletList() 글머리표
문제의 원인이 다른데 있는거 같아서 혹시나 해서 여쭈어 보는데,
문단모양번호에서 글머리표가 있을때,
header.getSize 값은 23으로 나오는데,
recordBody에서 bullet() 함수 부분에서는 25byte를 읽고 있는데,
혹시 이것이 문제가 되는것이 아닐까요?
=> 소스를 수정해서 23byte만 읽게 수정해보면,
그 이후에 확장레코드구조가 나오지 않고, 모두 기본 레코드 구조로 나옵니다
시간이 좀 허락되어.. 좀 더 살펴보니..
bullet을 읽는 부분이 잘 못 돼서... 나머지 부분이 2byte 밀린 거 같습니다.
수정하였습니다.
소스를 다시 받아서 테스트 해보세요.
테스트 결과 이상없는거 확인하였습니다...
정말 감사드립니다