mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
This commit is contained in:
1 parent
ca8f22dba1
commit
d3904521b9
5 files changed
+244
-99
No files matched your search
+23
-8
@@ -1496,26 +1496,41 @@ async function exportFile(whole) {
|
||||
return;
|
||||
}
|
||||
const label = whole ? (format.value === "pdf" ? "PDF" : "ZIP") : format.label;
|
||||
const extension = whole ? label.toLowerCase() : format.extension;
|
||||
const mime = whole && format.value !== "pdf" ? "application/zip" : format.mime;
|
||||
const openSeq = state.openSeq;
|
||||
const fileName = whole ? `${baseFileName()}.${label.toLowerCase()}` : pageFileName(format.extension);
|
||||
const fileName = whole ? `${baseFileName()}.${extension}` : pageFileName(extension);
|
||||
const pageIndex = state.pageIndex;
|
||||
const dpi = exportFormatUsesDPI(format.value) ? currentImageDPI() : 0;
|
||||
state.exporting = true;
|
||||
updateControls();
|
||||
setBusy(true, `正在生成 ${label}`, null, whole ? STATUS.exporting : STATUS.pageExporting);
|
||||
try {
|
||||
const dpi = exportFormatUsesDPI(format.value) ? currentImageDPI() : 0;
|
||||
const file = window.showSaveFilePicker ? await window.showSaveFilePicker({
|
||||
suggestedName: fileName,
|
||||
types: [{ description: label, accept: { [mime]: [`.${extension}`] } }],
|
||||
}) : null;
|
||||
if (openSeq !== state.openSeq) {
|
||||
return;
|
||||
}
|
||||
const result = whole
|
||||
? await callWASM("ofdgoExportDocument", format.value, dpi)
|
||||
: await callWASM("ofdgoExportPage", state.pageIndex, format.value, dpi);
|
||||
? await callWASM("ofdgoExportDocument", format.value, dpi, file)
|
||||
: await callWASM("ofdgoExportPage", pageIndex, format.value, dpi, file);
|
||||
if (openSeq !== state.openSeq) {
|
||||
return;
|
||||
}
|
||||
setProgress(`正在保存 ${result.label}`, 100);
|
||||
const bytes = result.bytes;
|
||||
downloadBytes(bytes, result.mime, fileName);
|
||||
setStatus(`${result.label} 导出完成 ${formatBytes(bytes.length, result.label)}`);
|
||||
if (result.blob) {
|
||||
downloadBytes(result.blob, result.mime, fileName);
|
||||
}
|
||||
setStatus(`${result.label} 导出完成 ${formatBytes(result.size, result.label)}`);
|
||||
} catch (err) {
|
||||
if (openSeq === state.openSeq) {
|
||||
showError(err, false);
|
||||
if (err.name === "AbortError") {
|
||||
setStatus("导出已取消");
|
||||
} else {
|
||||
showError(err, false);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
state.exporting = false;
|
||||
|
||||
@@ -1,14 +1,49 @@
|
||||
importScripts("./wasm_exec.js");
|
||||
|
||||
self.onmessage = ({ data: { id, name, args } }) => {
|
||||
let pending = Promise.resolve();
|
||||
self.onmessage = ({ data }) => {
|
||||
pending = pending.then(() => handleMessage(data));
|
||||
};
|
||||
async function handleMessage({ id, name, args }) {
|
||||
let output;
|
||||
try {
|
||||
const payload = globalThis[name](...args);
|
||||
const chunks = [];
|
||||
let size = 0;
|
||||
const exporting = name === "ofdgoExportPage" || name === "ofdgoExportDocument";
|
||||
if (exporting) {
|
||||
const file = args.pop();
|
||||
if (file) {
|
||||
output = await file.createWritable();
|
||||
}
|
||||
args.push((bytes, done) => {
|
||||
size += bytes.length;
|
||||
if (output) {
|
||||
output.write(bytes).then(() => done(), (err) => done(err.message));
|
||||
} else {
|
||||
chunks.push(new Blob([bytes]));
|
||||
setTimeout(done, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
const payload = await globalThis[name](...args);
|
||||
const result = typeof payload === "string" ? JSON.parse(payload) : payload;
|
||||
if (exporting && result.ok) {
|
||||
result.data.size = size;
|
||||
if (output) {
|
||||
await output.close();
|
||||
} else {
|
||||
result.data.blob = new Blob(chunks, { type: result.data.mime });
|
||||
}
|
||||
} else if (output) {
|
||||
await output.abort();
|
||||
}
|
||||
output = null;
|
||||
self.postMessage({ id, ...result }, result.data?.bytes ? [result.data.bytes.buffer] : []);
|
||||
} catch (err) {
|
||||
await output?.abort().catch(() => {});
|
||||
self.postMessage({ id, ok: false, error: err.message });
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function exitWASM(err) {
|
||||
self.postMessage({ type: "exit", error: err?.message || "引擎运行中断" });
|
||||
|
||||
Reference in new issue
Block a user