Перейти к основному содержимому
clawam tools
Инструменты Документы Daoark EN Главная Главная / Документы › Главная manifest.json "']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } // 解析页数 function getPageCount(text) { var m = text.match(/\/Type\s*\/Page[^s]/g); return m ? m.length : 0; } // 解析页范围 "1-3,5,7-9" → [1,2,3,5,7,8,9] function parseRange(s, max) { if (!s) return []; // 空 = 所有页 var pages = []; var parts = s.split(','); for (var i = 0; i < parts.length; i++) { var p = parts[i].trim(); if (!p) continue; if (p.indexOf('-') >= 0) { var ab = p.split('-'); var a = parseInt(ab[0], 10), b = parseInt(ab[1], 10); if (!(a > 0) || !(b >= a)) continue; for (var k = a; k <= b && k <= max; k++) pages.push(k); } else { var n = parseInt(p, 10); if (n > 0 && n <= max) pages.push(n); } } return Array.from(new Set(pages)).sort(function(a, b) { return a - b; }); } function readPdfHeader(file, cb) { var blob = file.slice(0, Math.min(file.size, 200 * 1024)); var r = new FileReader(); r.onload = function(e) { var bytes = new Uint8Array(e.target.result); var s = ''; for (var i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]); cb(s); }; r.readAsArrayBuffer(blob); } $('btn-analyze').addEventListener('click', function() { var f = $('file').files[0]; if (!f) { showError('请先选 PDF'); return; } readPdfHeader(f, function(text) { var pages = getPageCount(text); if (pages === 0) { showError('无法解析页数(请确认是有效 PDF)'); return; } var sizeKB = (f.size / 1024).toFixed(1); showResult( '
' + '文件: ' + escapeHtml(f.name) + '
' + '大小: ' + sizeKB + ' KB
' + '页数: ' + pages + '
' + '点击"预览旋转"查看不同角度的效果。' + '
', '已解析,' + pages + ' 页' ); }); }); $('btn-preview').addEventListener('click', function() { var f = $('file').files[0]; if (!f) { showError('请先选 PDF 并解析'); return; } readPdfHeader(f, function(text) { var pages = getPageCount(text); if (pages === 0) { showError('无法解析'); return; } var angle = parseInt($('angle').value, 10); var rangeStr = $('range').value; var pagesAffected = rangeStr ? parseRange(rangeStr, pages) : (function() { var a = []; for (var i = 1; i <= pages; i++) a.push(i); return a; })(); if (rangeStr && pagesAffected.length === 0) { showError('页范围无效'); return; } // 渲染预览 SVG var W = 600, H = 400; var cellW = 80, cellH = 100; var cols = Math.min(8, pages); var rows = Math.ceil(pages / cols); var svg = ''; svg += '旋转预览 (' + angle + '°)'; for (var p = 1; p <= pages; p++) { var col = (p - 1) % cols; var row = Math.floor((p - 1) / cols); var x = 30 + col * (cellW + 10); var y = 40 + row * (cellH + 30); var isAffected = pagesAffected.indexOf(p) >= 0; // 原图 svg += ''; svg += 'P' + p + ''; // 旋转箭头 if (isAffected) { svg += '→'; // 旋转后 var rx = x + cellW + 15; svg += ''; svg += ''; svg += 'P' + p + ''; svg += ''; } } svg += ''; var out = svg + '
' + '计划: 旋转 ' + pagesAffected.length + ' / ' + pages + ' 页,角度 ' + angle + '° 顺时针
' + '工具推荐: PDFsam 免费、qpdf 命令行、Smallpdf 在线
' + 'qpdf 命令: qpdf --rotate=' + angle + ':' + (rangeStr || '1-z') + ' in.pdf out.pdf' + '
'; showResult(out, '将旋转 ' + pagesAffected.length + ' 页 @ ' + angle + '°'); }); }); $('btn-clear').addEventListener('click', function() { $('file').value = ''; $('range').value = ''; var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; }); })();