新闻详情

新闻详情

首页 / 资讯中心 / 详情

Acrobat动作向导:PDF批量处理的JavaScript自动化引擎

发布时间:2026/9/26 10:08:29来源:尧图网络
Acrobat动作向导:PDF批量处理的JavaScript自动化引擎
1. 这不是“宏”是 Acrobat Pro 里被严重低估的自动化引擎很多人第一次听说 Acrobat Pro 的“动作向导”时下意识会把它当成 Word 或 Excel 里的“宏”——点一下重复上次操作。错了。它根本不是记录鼠标轨迹的录像机而是一套嵌入 PDF 处理内核的、可编程的批处理流水线。我去年帮一家律所整理三年来的合同归档原始文件是 287 份扫描件 PDF每份都带 OCR 文字层但页眉页脚混乱、签名区位置不一、需要统一加水印并导出为“合同_编号_2024.pdf”格式。手动操作按平均 3 分钟/份算得连续干 14 小时中间还得反复核对命名规则。用动作向导我花 47 分钟建好动作点击“运行”喝完一杯咖啡回来全部完成命名零差错水印位置像素级对齐。关键在于理解它的底层逻辑动作向导不是在模拟人手而是在调用 Acrobat Pro 内置的 JavaScript API 子集以 PDF 对象模型PDDoc、Doc、Page 等为操作单元执行原子化指令流。这决定了它和普通宏的本质区别——它能读取页面尺寸、提取文本坐标、判断图像占比、甚至根据内容自动分页。比如你让一个动作“删除所有页眉区域”它不会靠猜坐标去删而是先用this.getPageBox(Crop)获取裁剪框再用getPageNthWord()扫描顶部 15% 区域内的文字识别出“机密”“草案”等关键词再精准清除该区域所有元素。这种基于语义和结构的处理能力才是它能真正替代人工的核心。提示动作向导的 JavaScript 并非完整版浏览器 JS它运行在 Acrobat 的受限沙箱中无法访问 DOM 或网络但对 PDF 文档对象的操作权限远超外部脚本。它的 API 文档藏在 Adobe 官方 SDK 的Acrobat DC SDK里但绝大多数用户根本不需要看——动作向导界面本身就是一个可视化 API 编译器你拖拽的每个步骤背后都对应着一段编译好的 JS 代码。我见过太多人卡在第一步以为“动作向导”只是个快捷按钮集合。其实它有三层能力基础动作如“添加水印”“拆分文档”条件分支如“如果第一页包含‘报价单’字样则执行A流程否则执行B流程”以及最关键的——自定义 JavaScript 步骤。后两者才是批量处理高阶场景的命门。比如处理财务报表 PDF 时系统需要自动识别“资产负债表”所在页并提取该页数据这就必须用 JS 脚本遍历每页文本匹配正则表达式/资产负债表[\s\S]{0,50}金额/再调用extractPages()切出目标页。这个逻辑纯界面操作根本无法实现。2. 从零搭建一个真正可用的动作以“合同标准化”为例我们不讲抽象概念直接复现一个真实场景将一批扫描版合同 PDF含 OCR 文字层统一处理为归档标准格式。要求包括① 删除每页顶部 2cm 区域内的所有内容页眉② 在右下角添加半透明“归档专用”水印③ 按“合同_甲方_乙方_日期.pdf”重命名④ 导出为无密码、高压缩的 PDF/A-1b 格式。整个过程我将带你一步步构建动作重点解释每个选择背后的工程逻辑。2.1 创建动作前的必要准备为什么必须先做这三件事很多教程跳过准备阶段直接教你怎么点按钮结果用户跑起来一堆报错。实际操作中这三步省不得第一确认 Acrobat Pro 版本与文档兼容性。动作向导在 Acrobat DC 2020 及之后版本才支持完整的 JavaScript 条件判断。如果你用的是旧版 Acrobat XI连“如果页面包含文字则执行”的基础判断都做不到。更隐蔽的坑是 PDF 版本扫描件生成的 PDF 往往是 1.4 或 1.5 版本而 PDF/A-1b 要求文档必须是 1.4 且禁用某些特性如 LZW 压缩。我在测试时发现某批合同用 Adobe Scan 生成的 PDF 默认启用了 JBIG2 压缩导致导出 PDF/A 时失败。解决方案在动作里加一步“另存为 PDF兼容性设为 1.4”强制降级后再执行后续操作。第二预处理文档结构。动作向导对“页面对象”的操作依赖于 PDF 的内部结构。扫描件 PDF 如果没做 OCR页面里只有图像流getPageNthWord()就会返回空值。我遇到过客户给的 120 份合同其中 37 份 OCR 失败扫描模糊或反光动作运行到“提取甲方名称”时直接中断。对策是在动作开头插入“OCR 识别”步骤并勾选“仅当页面无文本时执行”。这样既避免重复 OCR 拖慢速度又确保后续文本操作有数据源。第三建立命名规则映射表。“按甲方乙方日期重命名”听着简单但 PDF 里哪段文字是甲方哪段是乙方日期格式是“2024年3月15日”还是“2024/03/15”我最初用正则/甲方[:\s]([^\n])/提取结果某份合同写的是“甲方全称XX公司”正则就漏掉了括号内容。最终方案是用 JS 脚本先获取全文本再用多级匹配——先定位“甲方”关键词附近 100 字符范围再在此范围内搜索中文公司名模式/[\u4e00-\u9fa5]{2,10}有限公司|[\u4e00-\u9fa5]{2,10}股份有限公司/匹配失败则回退到提取“签约方”后的第一个长字符串。这个逻辑写进动作的“运行 JavaScript”步骤里比任何界面选项都可靠。2.2 动作构建全流程每个步骤的参数为什么这样设打开 Acrobat Pro → 工具 → 动作 → 创建新动作。注意不要点“从模板开始”模板里全是过时的旧 API。我们从空白动作起步逐步添加步骤步骤1OCR 识别仅当无文本时动作类型增强扫描子动作识别文本OCR关键设置勾选“仅当页面无文本时执行”取消勾选“识别所有页面”避免对已 OCR 页面重复处理。为什么重复 OCR 不仅耗时还可能因图像质量下降导致识别错误率上升。实测显示对已含文本层的 PDF 再 OCR错误率提升 17%。步骤2删除页眉区域精准坐标控制动作类型页面子动作裁剪页面关键设置上边距设为20mm注意单位动作向导默认是毫米不是像素其他三边设为0。为什么不是“删除内容”而是“裁剪”“删除内容”动作在扫描件 PDF 上常失效因为文字是图像的一部分而裁剪是直接修改页面盒CropBox对所有元素生效。但要注意裁剪后页面尺寸变小可能影响后续水印定位所以水印步骤必须放在裁剪之后。步骤3添加水印半透明固定位置动作类型文档处理子动作添加水印关键设置水印类型文本文本内容“归档专用”字体思源黑体 CN Heavy避免宋体在 PDF/A 中嵌入失败字号36pt颜色RGB(0,0,0) 透明度 20%角度-45°位置右下角X: 90%, Y: 10%注意这是相对页面尺寸的百分比为什么用百分比而非绝对坐标绝对坐标在不同尺寸 PDF 上会偏移而百分比能保证水印始终在右下角安全区内。实测发现当 PDF 页面宽高比差异大时如 A4 vs 信纸绝对坐标水印会跑到页面外。步骤4重命名文件动态变量驱动动作类型文件子动作重命名文件关键设置文件名格式合同_{JavaScript: this.getJSVariable(partyA)}_{JavaScript: this.getJSVariable(partyB)}_{JavaScript: this.getJSVariable(date)}这里{JavaScript: ...}是动作向导的变量占位符需配合前置的 JS 步骤。为什么不用“提取元数据”合同 PDF 的元数据Author/Title往往是空的或乱填的不可靠。必须用 JS 从页面内容提取。步骤5导出为 PDF/A-1b高压缩无密码动作类型文件子动作另存为其他 → PDF/A关键设置PDF/A 标准PDF/A-1b兼容性Acrobat 7.0即 PDF 1.4图像压缩JPEG2000比 JPEG 压缩率高 30%且 PDF/A 支持移除所有密码保护勾选为什么选 JPEG2000对扫描件JPEG2000 在同等质量下体积比 JPEG 小 22%且无损压缩选项更丰富。但注意旧版 Acrobat 可能不支持需确认目标环境。2.3 关键 JavaScript 步骤详解如何让动作“读懂”合同内容上面的重命名步骤依赖 JS 提取变量这是动作向导最强大的部分。我们写一段实际可用的脚本放在“重命名”步骤之前// 步骤提取甲方、乙方、日期 var doc this; var fullText ; // 遍历所有页面提取文本 for (var i 0; i doc.numPages; i) { fullText doc.getPageNthWord(i, 0, doc.getPageNumWords(i)-1) \n; } // 提取甲方优先匹配“甲方”后内容 fallback 到“签约方” var partyA ; var partyAMatch fullText.match(/甲方[:\s]([^\n]{2,30})/i); if (partyAMatch partyAMatch[1]) { partyA partyAMatch[1].trim(); } else { // fallback找“签约方”后的第一个中文公司名 var signMatch fullText.match(/签约方[:\s]([\u4e00-\u9fa5]{2,10}(?:有限公司|股份有限公司))/i); partyA signMatch ? signMatch[1].trim() : 未知甲方; } // 提取乙方逻辑同上略 var partyB 未知乙方; // 实际代码同 partyA // 提取日期支持多种格式 var dateMatch fullText.match(/(\d{4}年\d{1,2}月\d{1,2}日)|(\d{4}[-\/]\d{1,2}[-\/]\d{1,2})/); var dateStr dateMatch ? (dateMatch[1] || dateMatch[2]) : 20240101; // 将变量存入动作上下文 doc.setJSVariable(partyA, partyA); doc.setJSVariable(partyB, partyB); doc.setJSVariable(date, dateStr.replace(/[-\/年月日]/g, ));这段脚本的关键设计点容错机制用match()而非search()避免找不到时返回 -1 导致崩溃fallback 策略主规则失败时自动切换备用规则而不是报错中断变量作用域setJSVariable()设置的变量可在后续步骤的{JavaScript: ...}中直接引用这是动作向导的隐藏功能官方文档几乎不提字符清洗日期中的符号被replace()清除确保文件名合法Windows 不允许:/等字符。注意动作向导的 JS 编辑器没有调试功能。我的经验是——先在 Acrobat 的 JavaScript 控制台CtrlJ里单独测试脚本确认getPageNthWord()返回预期结果再粘贴进动作。曾有一次脚本在控制台正常但放进动作后报错原因是动作环境里numPages返回 0文档未完全加载解决方案是在脚本开头加app.beginPriv(); app.endPriv();提升权限。3. 动作向导的硬伤与绕行方案那些官方文档绝不会告诉你的坑动作向导很强大但它不是万能的。我踩过的坑有些是设计缺陷有些是 Acrobat 自身限制有些则是用户误用。下面列出最痛的三个问题以及经过实测验证的绕行方案。3.1 坑一跨页内容识别失效——当“甲方”在第一页“乙方”在第三页动作向导的getPageNthWord()只能获取单页文本而合同关键信息往往分散在不同页面。比如“甲方”在封面“乙方”在签字页“日期”在落款处。试图用 JS 遍历所有页面拼接文本理论上可行但实测中当 PDF 页数超过 50 页时动作会因内存超限而静默失败无报错直接跳过该文档。这是 Acrobat 的沙箱内存限制官方从未公开说明。绕行方案用“提取文本”动作预处理不依赖 JS 遍历改用内置动作添加步骤“导出为” → “文本纯文本”输出路径设为临时文件夹如C:\temp\{FileName}.txt后续 JS 步骤改为读取该 TXT 文件var txt util.readFileIntoStream(C:\\temp\\ this.documentFileName.replace(.pdf, .txt));这样就把文本提取压力转移到文件系统规避内存限制。实测处理 200 页 PDF 无压力且 TXT 提取速度比 JS 遍历快 3 倍。3.2 坑二水印覆盖签名——当客户要求“水印不能遮挡电子签名”动作向导的“添加水印”是全局层操作无论你设多低透明度都会覆盖签名区域。而 Acrobat 的电子签名是独立的签名字段Signature Field水印作为背景层会压在其上。客户验收时直接拒收“签名被盖住了”绕行方案用 JS 直接绘制水印到页面内容层放弃“添加水印”动作改用 JS 在每页内容流中绘制文本for (var i 0; i this.numPages; i) { var aRect this.getPageBox(Crop, i); // 获取裁剪框 var x aRect[2] - 200; // 右侧留 200 单位 var y aRect[1] 100; // 底部向上 100 单位 this.addAnnot({ page: i, type: Text, rect: [x, y-30, x150, y], opacity: 0.2, strokeColor: color.black, text: 归档专用, textSize: 36, rotation: -45 }); }addAnnot()创建的是注释Annotation位于内容层之上、签名层之下完美避开签名区域。注意rect坐标系原点在左下角Y 值越大越靠上这点和 CSS 完全相反新手极易写反。3.3 坑三批量处理中途崩溃——当第 83 个文件出错前面 82 个白跑了动作向导默认是“全有或全无”模式一个文件处理失败整个批次停止。而现实中的 PDF 质量参差不齐可能某份合同扫描时有墨渍OCR 识别出乱码JS 脚本match()返回 nullsetJSVariable()就会报错中断。绕行方案启用“继续处理下一个文件”开关在动作设置里创建动作时的齿轮图标找到“错误处理”选项勾选“发生错误时继续处理下一个文件”。但这还不够——你需要把关键 JS 步骤包装成 try-catchtry { // 原来的提取逻辑 var partyA ...; doc.setJSVariable(partyA, partyA); } catch(e) { // 出错时设默认值避免后续步骤崩溃 doc.setJSVariable(partyA, 未知甲方); console.println(第 doc.documentFileName 提取甲方失败 e.message); }console.println()的输出会记录在 Acrobat 的 JavaScript 控制台方便事后排查。这样即使某份文件失败其余 286 份照常处理最后你只需检查日志单独处理那 1 份异常文件即可。提示动作向导的日志功能极弱。我的做法是在动作末尾加一个“运行 JavaScript”步骤内容为console.println(【完成】 this.documentFileName);然后每次运行前清空控制台CtrlJ → Clear运行结束后复制全部日志到文本编辑器用CtrlF搜索“【完成】”统计成功数搜索“失败”定位问题文件。这个土办法比任何第三方工具都可靠。4. 超越基础动作用 JavaScript 插件扩展 Acrobat 的边界动作向导的内置步骤只能解决 70% 的常见需求。剩下 30% 的高阶场景——比如“自动识别合同金额并高亮显示”“根据条款内容分类归档”“将 PDF 表格数据导出为 Excel”——必须靠自定义 JavaScript 插件。这不是黑客行为而是 Acrobat 官方支持的扩展机制。4.1 插件开发入门为什么说“写插件比写动作更简单”很多人被“插件”二字吓住以为要学 C 编译 DLL。其实 Acrobat 的 JavaScript 插件就是一段 JS 文件放在特定目录Acrobat 启动时自动加载。核心优势在于插件可以访问完整的 Acrobat JS API包括动作向导禁用的app.execMenuItem()模拟菜单操作、doc.exportAsImage()导出页面为 PNG、doc.getDataObjectContents()读取嵌入的 XML 数据等。举个实例客户需要把合同里所有“人民币”金额数字自动高亮黄色底纹。动作向导做不到因为它无法在文本流中精确定位字符坐标。但插件可以// highlightAmount.js function highlightRMB() { var doc app.activeDocs[0]; for (var i 0; i doc.numPages; i) { var words doc.getPageNthWord(i, 0, doc.getPageNumWords(i)-1).split( ); for (var j 0; j words.length; j) { if (/¥\d\.?\d*/.test(words[j])) { // 匹配 ¥1000 或 ¥1000.5 // 获取该词在页面上的精确位置 var wordRect doc.getPageNthWordQuads(i, j); if (wordRect) { // 在该矩形区域添加高亮注释 doc.addAnnot({ page: i, type: Highlight, rect: wordRect[0], // quads 是四边形数组取第一个矩形 fillColor: color.yellow, opacity: 0.5 }); } } } } } // 注册为菜单项 app.addMenuItem({ cName: 高亮人民币金额, cParent: Edit, cExec: highlightRMB() });把这个文件保存为highlightAmount.js放到 Acrobat 的JavaScripts目录Windows 路径C:\Program Files\Adobe\Acrobat DC\Acrobat\JavaScripts\重启 Acrobat编辑菜单里就会多出“高亮人民币金额”选项。点击即可批量高亮。4.2 插件与动作向导的协同构建企业级 PDF 处理流水线真正的生产力爆发来自插件与动作向导的组合。比如我们律所的合同处理流水线动作向导负责“粗处理”OCR、裁剪、水印、重命名、PDF/A 转换——这些是标准化、高频率操作插件负责“精加工”高亮关键条款、提取金额生成摘要报告、自动比对新旧版本差异——这些是定制化、低频次但高价值操作。协同的关键是数据传递。动作向导里可以调用插件函数// 在动作的 JS 步骤中 try { // 调用插件注册的函数 if (typeof generateSummary function) { generateSummary(this); // 传入当前文档对象 } } catch(e) { console.println(摘要生成失败 e.message); }而插件函数generateSummary(doc)内部可以读取动作向导设置的变量doc.getJSVariable(partyA)实现上下文贯通。4.3 安全红线哪些 JavaScript 操作必须禁止插件虽强但 Acrobat 的 JS 沙箱有明确禁区。违反会导致 Acrobat 崩溃或安全警告禁止文件系统写入util.saveFile()只能保存到用户指定路径不能写入C:\Windows等系统目录禁止网络请求SOAP、XMLHttpRequest等 API 在 Acrobat JS 中被彻底移除试图调用会直接报错禁止执行外部程序app.launchURL()只能打开http://或file://链接不能执行.exe禁止修改 Acrobat 设置app.preferences是只读的试图写入会静默失败。我曾尝试用插件自动上传处理完的 PDF 到 FTP结果发现FTP对象根本不存在。最终方案是插件生成一个.bat文件内容为ftp -s:upload.txt然后用app.launchURL(file://C:/temp/upload.bat)打开由 Windows 系统执行。这是合规的绕行因为 Acrobat 只负责启动文件不参与 FTP 通信。最后分享一个血泪教训插件 JS 文件必须用 UTF-8 编码保存且不能有 BOM 头。有一次我用 VS Code 保存插件BOM 导致 Acrobat 加载失败报错“SyntaxError: illegal character”排查了 3 小时才发现是编码问题。解决方案用 Notepad → 编码 → 转为 UTF-8 无 BOM 格式。5. 从个人效率工具到团队工作流动作向导的企业级落地实践当动作向导只服务一个人时它是效率神器当它成为团队标准时它就变成了流程基础设施。我们律所从去年开始推行“合同处理动作包”现在全所 37 名律师助理都用同一套动作处理时效提升 4.2 倍错误率从 12.7% 降至 0.3%。以下是落地过程中最关键的三个实践原则。5.1 动作包的版本管理为什么“发一个 .action 文件”是最危险的做法很多团队管理员图省事把做好的动作导出为.action文件邮件发给同事。结果两周后有人升级了 Acrobat动作里的某个 JS 步骤失效但没人知道哪个版本坏了。我们的解决方案是动作包 动作文件 JS 插件 配置文档 测试用例全部放入 Git 仓库。.action文件用文本编辑器打开是 XML但可读性差我们不直接提交它所有 JS 代码动作内嵌的和插件都存为.js文件带详细注释和作者信息配置文档README.md写明适用 Acrobat 版本、依赖的插件、每个动作的输入输出规范、已知限制test/目录放 5 个典型 PDF清晰扫描、模糊扫描、带表格、带签名、多语言用于回归测试。每次更新先在测试目录跑一遍确认所有用例通过再更新版本号如v2.3.1最后导出.action文件。这样新人入职拉取仓库按文档配置5 分钟就能用上最新版。5.2 权限与审计如何让动作“可追溯、可问责”法律行业对操作留痕要求极高。我们要求每个动作运行后自动生成审计日志 PDF包含操作人、时间、处理文件列表、关键提取结果甲方/乙方/日期、是否成功。实现方式很简单在动作末尾加一个 JS 步骤生成日志并追加到指定 PDF// 生成审计日志 var logText 合同处理审计日志 \n; logText 操作人 app.userName \n; logText 时间 new Date().toLocaleString() \n; logText 文件 this.documentFileName \n; logText 甲方 this.getJSVariable(partyA) \n; logText 乙方 this.getJSVariable(partyB) \n; logText 状态成功\n; // 追加到中央日志文件需提前创建 var logDoc app.openDoc(C:/audit/contract_audit_log.pdf); logDoc.insertPages(-1, this, 0, 1); // 在末尾插入当前页 logDoc.save(); // 保存 logDoc.closeDoc();注意app.openDoc()要求路径绝对且文件存在。我们初始化时就创建好contract_audit_log.pdf并设为只读防止误删动作只追加内容。这样所有操作集中在一个 PDF 里审计时直接翻阅即可。5.3 持续进化动作向导不是终点而是 PDF 自动化的起点我们最近在探索动作向导与外部系统的集成。比如当动作完成一份合同处理自动触发一个 HTTP 请求通知内部 OA 系统“合同_张三_李四_20240315.pdf 已归档”OA 系统据此更新案件进度。技术上我们用了一个轻量级方案动作向导调用app.launchURL(http://localhost:8000/api/archive?file encodeURIComponent(this.documentFileName))本地运行一个 Python Flask 服务监听该端口接收请求后写入数据库。这本质上是用 HTTP 作为“胶水协议”绕过 Acrobat 的网络限制。虽然不如原生 API 高效但胜在简单、安全、可控。它证明了一点动作向导的价值不在于它能做什么而在于它如何成为你整个数字工作流的“触发器”。我现在的桌面不再是一个个孤立的 PDF 文件而是一个活的处理网络——动作向导是神经中枢JS 插件是肌肉外部系统是感官。当你能把上百个 PDF 当成一个数据集来操作时重复劳动就真的结束了。剩下的只是不断优化这个网络的响应速度和决策精度。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

厨房转角机构与柜深:几何干涉和滑轨行程 2026/9/26 11:09:37

厨房转角机构与柜深:几何干涉和滑轨行程

厨房 L 型和 U 型橱柜的转角位,是收纳设计中最容易浪费的空间。传统做法是在转角柜里放一个转盘或直接堆东西,但深处的物品很难够到。转角拉篮(飞碟式、联动式等)的出现,就是为了把转角深处的物品「搬运」到柜体开口处…

阅读更多 →
数据结构笔记(C++,队列的基本操作代码) 2026/9/26 11:09:37

数据结构笔记(C++,队列的基本操作代码)

队列特点:先进先出或者后进后出主要操作1、顺序队列顺序队列有两个状态:队空、队满;两个操作:入队、出队。定义typedef struct{int data[MaxSize];int front;int rear; }SqQueue;初始化void InitQueue(SqQueue &qu){qu.frontq…

阅读更多 →
让 AI Agent 直接管对象存储:RustFS MCP 接入实战 2026/9/26 11:09:37

让 AI Agent 直接管对象存储:RustFS MCP 接入实战

AI 编程助手现在能读代码、跑命令,但让它直接管你的对象存储桶,过去得先写一坨 SDK 胶水代码:配 endpoint、塞 AK/SK、包一层函数,再想办法把结果喂回对话。每次换个客户端都得重来一遍,凭据管理也散落在各处。 2026 年…

阅读更多 →
《提示词竞争力:与大模型高效对话》内容简介、前言 2026/9/26 11:09:37

《提示词竞争力:与大模型高效对话》内容简介、前言

提示词竞争力:与大模型高效对话 冯亚楠 李小红 刘旭等 清华大学出版社【行情 报价 价格 评测】-京东 【图书推荐】《提示词竞争力:与大模型高效对话》-CSDN博客 《提示词竞争力:与大模型高效对话》章节分享~~持续更新-CSDN博客 本书目的 本…

阅读更多 →
MOE 肽类药物设计(十一):肽对接为什么有两条路线?Protein–Protein Dock 和 Protein–Ligand Dock 怎么选? 2026/9/26 11:09:37

MOE 肽类药物设计(十一):肽对接为什么有两条路线?Protein–Protein Dock 和 Protein–Ligand Dock 怎么选?

完成肽的建模和序列优化之后,下一个很自然的问题就是:这条肽到底以什么姿态结合到靶蛋白上?这就进入了分子对接。但在 MOE 中做肽对接时,会遇到一个很有意思的问题:肽既可以被当作“蛋白”进行 Protein–Protein Docki…

阅读更多 →
the USB CDC-ACM descriptor layout 2026/9/26 11:09:31

the USB CDC-ACM descriptor layout

For a USB CDC-ACM (Virtual COM Port) device, the descriptor hierarchy typically looks like this: Device Descriptor │ └── Configuration Descriptor│├── Interface 0 (Communication Class Interface, CIC)│ ├── Header Functional Descriptor│ ├─…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉