Skip to content

20xx이상? 버전에서 이미지 추가하면 한글파일 안열리는거 해결 #88

Description

@sub4b

최근 2022, 2024로 한글프로그램 변경하면서 부터
이미지 추가 하면 열리던 파일이 안열리더라고요. 다른 버전은 확인 못했습니다.

github는 제 파일 관리용으로 써서 다른 분꺼 변경하거나 가져와서 패치? 하는거 몰라서 이렇게 올립니다.

chatgpt가 다했습니다.

DocInfoParser.ts의 visitBinData 변경하면 됩니다.

visitBinData(record: HWPRecord) {
const reader = new ByteReader(record.payload);
reader.readUInt16();
const id = reader.readUInt16();
const extension = reader.readString();

const path = Root Entry/BinData/BIN${${id.toString(16).toUpperCase()}.padStart(4, '0')}.${extension};

const raw = find(this.container, path)!.content;
const payload = raw instanceof Uint8Array ? raw : new Uint8Array(raw);

// ---- 1) 압축 안 된 PNG/JPG 감지 ----
const isPNG = payload[0] === 0x89 && payload[1] === 0x50;
const isJPG = payload[0] === 0xFF && payload[1] === 0xD8;

if (isPNG || isJPG) {
// raw 이미지 그대로 넣기
this.result.binData.push(new BinData(extension, payload));
return;
}

// ---- 2) HWP 2022+ (앞 4바이트 = 원본 길이) 처리 ----
let sliced = payload;
try {
const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
const decompressedLength = view.getUint32(0, true);
const zlibHeader = payload[4];

if (zlibHeader === 0x78 && decompressedLength < payload.length * 50) {
  sliced = payload.slice(4);
}

} catch (e) {
console.warn("DataView error: fallback to payload");
}

// ---- 3) 압축된 경우 inflate 시도 ----
let data;
try {
data = inflate(sliced, { windowBits: -15 });
} catch (err) {
console.warn("inflate 실패 → 원본 payload 재시도", err);
try {
data = inflate(payload, { windowBits: -15 });
} catch (err2) {
console.warn("inflate 최종 실패 → raw 그대로 처리", err2);
data = payload; // raw fallback
}
}

this.result.binData.push(new BinData(extension, data));
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions