如何用JavaScript在浏览器中检测PDF文件为US Legal或US Letter格式
实现PDF页面格式检测方案
你当前持有的是浏览器端application/pdf类型的File对象,jsPDF本身仅支持PDF生成,不具备现有PDF解析能力,可通过以下方案实现需求:
推荐方案:使用pdf.js实现(稳定性最高)
pdf.js是专门用于浏览器环境的PDF解析库,可直接读取File对象并提取页面尺寸属性,实现逻辑如下:
核心实现代码
// 单位转换常量:PDF默认单位为点,1英寸 = 72点 const INCH_TO_POINT_RATIO = 72; // 误差阈值,避免PDF生成时的精度问题导致判断失败 const TOLERANCE = 0.1; async function checkPdfPageFormat(pdfFile) { // 1. 将File对象转为ArrayBuffer const arrayBuffer = await pdfFile.arrayBuffer(); // 2. 加载PDF文档 const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise; // 3. 遍历所有页面提取尺寸(如果仅需判断第一页可直接取页码1) const results = []; for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) { const page = await pdf.getPage(pageNum); const [x1, y1, x2, y2] = page.mediaBox; // 计算页面实际宽高(点单位) const widthPt = Math.abs(x2 - x1); const heightPt = Math.abs(y2 - y1); // 转为英寸单位 let widthIn = widthPt / INCH_TO_POINT_RATIO; let heightIn = heightPt / INCH_TO_POINT_RATIO; // 横竖朝向无关,统一取短边、长边比较 const shortSide = Math.min(widthIn, heightIn); const longSide = Math.max(widthIn, heightIn); let format = 'other'; // 判断是否符合US Letter: 8.5in * 11in if ( Math.abs(shortSide - 8.5) <= TOLERANCE && Math.abs(longSide - 11) <= TOLERANCE ) { format = 'US Letter'; } // 判断是否符合US Legal: 8.5in *14in else if ( Math.abs(shortSide - 8.5) <= TOLERANCE && Math.abs(longSide - 14) <= TOLERANCE ) { format = 'US Legal'; } results.push({ pageNum, format, widthIn, heightIn }); } return results; } // 调用示例 // const file = document.querySelector('input[type="file"]').files[0]; // checkPdfPageFormat(file).then(console.log);
轻量备选方案:使用pdf-lib实现
如果项目对包体积要求较高,可以选择更轻量的pdf-lib库实现,核心逻辑和上述一致,仅API调用方式有区别。
注意事项
- 若PDF设置了裁剪框(CropBox),实际显示尺寸以CropBox为准,可将代码中的
page.mediaBox替换为page.cropBox适配这类场景 - 可根据业务需求调整判断逻辑:如果要求所有页面均符合指定格式,可遍历所有页面统一校验;如果仅需判断首页格式,直接读取第1页即可
内容的提问来源于stack exchange,提问作者snowfrogdev
相关产品推荐
相关产品推荐

