최근 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));
}
최근 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];
} 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));
}