mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-29 17:27:08 +08:00
1 parent
a29fbbd31b
commit
ca8f22dba1
4 files changed
+85
-70
No files matched your search
@@ -42,7 +42,7 @@
|
||||
<button id="annotationButton" class="button" type="button" data-short="注" title="关闭注解" aria-label="关闭注解" aria-pressed="true">注解</button>
|
||||
</div>
|
||||
<div class="tool-group">
|
||||
<select id="pageExportFormat" class="format-select" title="单页格式" aria-label="单页格式" disabled></select>
|
||||
<select id="exportFormat" class="format-select" title="导出格式" aria-label="导出格式" disabled></select>
|
||||
<select id="imageDPI" class="format-select dpi-select" title="图片 DPI" aria-label="图片 DPI" disabled>
|
||||
<option value="96">96</option>
|
||||
<option value="150">150</option>
|
||||
@@ -50,7 +50,7 @@
|
||||
<option value="600">600</option>
|
||||
</select>
|
||||
<button id="exportPageButton" class="button" type="button" data-short="单" title="导出单页" aria-label="导出单页" disabled>单页</button>
|
||||
<button id="exportButton" class="button" type="button" data-short="全" title="导出文档 PDF" aria-label="导出文档 PDF" disabled>文档</button>
|
||||
<button id="exportButton" class="button" type="button" data-short="全" title="导出文档" aria-label="导出文档" disabled>文档</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
+23
-56
@@ -94,7 +94,7 @@ const el = {
|
||||
continuousButton: document.querySelector("#continuousButton"),
|
||||
annotationButton: document.querySelector("#annotationButton"),
|
||||
imageDPI: document.querySelector("#imageDPI"),
|
||||
pageExportFormat: document.querySelector("#pageExportFormat"),
|
||||
exportFormat: document.querySelector("#exportFormat"),
|
||||
exportPageButton: document.querySelector("#exportPageButton"),
|
||||
exportButton: document.querySelector("#exportButton"),
|
||||
emptyState: document.querySelector("#emptyState"),
|
||||
@@ -199,9 +199,9 @@ document.addEventListener("selectionchange", () => {
|
||||
unmountPage(index);
|
||||
}
|
||||
});
|
||||
el.pageExportFormat.addEventListener("change", () => updateDPIControl());
|
||||
el.exportPageButton.addEventListener("click", exportCurrentPage);
|
||||
el.exportButton.addEventListener("click", exportPDF);
|
||||
el.exportFormat.addEventListener("change", () => updateDPIControl());
|
||||
el.exportPageButton.addEventListener("click", () => exportFile(false));
|
||||
el.exportButton.addEventListener("click", () => exportFile(true));
|
||||
el.refreshAppButton.addEventListener("click", refreshApplication);
|
||||
el.pageInput.addEventListener("change", () => {
|
||||
const page = Number.parseInt(el.pageInput.value, 10);
|
||||
@@ -593,15 +593,15 @@ async function refreshApplication() {
|
||||
async function loadExportFormats() {
|
||||
const formats = await callWASM("ofdgoExportFormats") || [];
|
||||
state.exportFormats = formats;
|
||||
el.pageExportFormat.replaceChildren();
|
||||
el.exportFormat.replaceChildren();
|
||||
for (const format of formats) {
|
||||
const option = document.createElement("option");
|
||||
option.value = format.value;
|
||||
option.textContent = format.label;
|
||||
el.pageExportFormat.append(option);
|
||||
el.exportFormat.append(option);
|
||||
}
|
||||
if (formats.length) {
|
||||
el.pageExportFormat.value = formats[0].value;
|
||||
el.exportFormat.value = formats[0].value;
|
||||
}
|
||||
updateDPIControl();
|
||||
}
|
||||
@@ -1487,61 +1487,32 @@ async function downloadAttachment(attachment) {
|
||||
}
|
||||
}
|
||||
|
||||
async function exportPDF() {
|
||||
async function exportFile(whole) {
|
||||
if (!state.doc || document.body.hasAttribute("aria-busy")) {
|
||||
return;
|
||||
}
|
||||
const openSeq = state.openSeq;
|
||||
state.exporting = true;
|
||||
updateControls();
|
||||
setBusy(true, "正在生成 PDF", 45, STATUS.exporting);
|
||||
try {
|
||||
const result = await callWASM("ofdgoExportPDF");
|
||||
if (openSeq !== state.openSeq) {
|
||||
return;
|
||||
}
|
||||
setProgress("正在保存 PDF", 86);
|
||||
const bytes = result.bytes;
|
||||
downloadBytes(bytes, "application/pdf", pdfFileName());
|
||||
setStatus(`PDF 导出完成 ${formatBytes(result.size || bytes.length)}`);
|
||||
} catch (err) {
|
||||
if (openSeq === state.openSeq) {
|
||||
showError(err, false);
|
||||
}
|
||||
} finally {
|
||||
state.exporting = false;
|
||||
if (openSeq === state.openSeq) {
|
||||
setBusy(false);
|
||||
updateControls();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function exportCurrentPage() {
|
||||
if (!state.doc || document.body.hasAttribute("aria-busy")) {
|
||||
return;
|
||||
}
|
||||
const format = el.pageExportFormat.value;
|
||||
const format = exportFormatInfo(el.exportFormat.value);
|
||||
if (!format) {
|
||||
return;
|
||||
}
|
||||
const info = exportFormatInfo(format);
|
||||
const label = info?.label || String(format || "").toUpperCase();
|
||||
const label = whole ? (format.value === "pdf" ? "PDF" : "ZIP") : format.label;
|
||||
const openSeq = state.openSeq;
|
||||
const fileName = pageFileName(info?.extension || format);
|
||||
const fileName = whole ? `${baseFileName()}.${label.toLowerCase()}` : pageFileName(format.extension);
|
||||
state.exporting = true;
|
||||
updateControls();
|
||||
setBusy(true, `正在生成 ${label}`, 45, STATUS.pageExporting);
|
||||
setBusy(true, `正在生成 ${label}`, null, whole ? STATUS.exporting : STATUS.pageExporting);
|
||||
try {
|
||||
const dpi = exportFormatUsesDPI(format) ? currentImageDPI() : 0;
|
||||
const result = await callWASM("ofdgoExportPage", state.pageIndex, format, dpi);
|
||||
const dpi = exportFormatUsesDPI(format.value) ? currentImageDPI() : 0;
|
||||
const result = whole
|
||||
? await callWASM("ofdgoExportDocument", format.value, dpi)
|
||||
: await callWASM("ofdgoExportPage", state.pageIndex, format.value, dpi);
|
||||
if (openSeq !== state.openSeq) {
|
||||
return;
|
||||
}
|
||||
setProgress(`正在保存 ${result.label || label}`, 86);
|
||||
setProgress(`正在保存 ${result.label}`, 100);
|
||||
const bytes = result.bytes;
|
||||
downloadBytes(bytes, result.mime || info?.mime || "application/octet-stream", fileName);
|
||||
setStatus(`${result.label || label} 导出完成 ${formatBytes(result.size || bytes.length, result.label || label)}`);
|
||||
downloadBytes(bytes, result.mime, fileName);
|
||||
setStatus(`${result.label} 导出完成 ${formatBytes(bytes.length, result.label)}`);
|
||||
} catch (err) {
|
||||
if (openSeq === state.openSeq) {
|
||||
showError(err, false);
|
||||
@@ -3224,9 +3195,9 @@ function updateControls() {
|
||||
el.fitButton.toggleAttribute("aria-pressed", hasDoc && state.fitMode === "width");
|
||||
el.fitHeightButton.toggleAttribute("aria-pressed", hasDoc && state.fitMode === "height");
|
||||
updateAnnotationButton();
|
||||
el.pageExportFormat.disabled = !hasDoc || state.exporting || !state.exportFormats.length;
|
||||
el.exportFormat.disabled = !hasDoc || state.exporting || !state.exportFormats.length;
|
||||
el.exportPageButton.disabled = !hasDoc || state.exporting || !state.exportFormats.length;
|
||||
el.exportButton.disabled = !hasDoc || state.exporting;
|
||||
el.exportButton.disabled = !hasDoc || state.exporting || !state.exportFormats.length;
|
||||
updateDPIControl();
|
||||
}
|
||||
|
||||
@@ -3329,13 +3300,9 @@ function baseFileName() {
|
||||
return base.replace(/[\\/:*?"<>|]+/g, "_").trim() || "ofdgo";
|
||||
}
|
||||
|
||||
function pdfFileName() {
|
||||
return `${baseFileName()}.pdf`;
|
||||
}
|
||||
|
||||
function pageFileName(extension) {
|
||||
const page = String(state.pageIndex + 1).padStart(String(state.doc?.pageCount || 1).length, "0");
|
||||
return `${baseFileName()}_p${page}.${extension || "bin"}`;
|
||||
return `${baseFileName()}_p${page}.${extension}`;
|
||||
}
|
||||
|
||||
function exportFormatInfo(value) {
|
||||
@@ -3347,7 +3314,7 @@ function exportFormatUsesDPI(value) {
|
||||
}
|
||||
|
||||
function updateDPIControl() {
|
||||
el.imageDPI.disabled = state.exporting || !state.doc || !exportFormatUsesDPI(el.pageExportFormat.value);
|
||||
el.imageDPI.disabled = state.exporting || !state.doc || !exportFormatUsesDPI(el.exportFormat.value);
|
||||
}
|
||||
|
||||
function currentImageDPI() {
|
||||
|
||||
Reference in new issue
Block a user