使用pdf-lib.js无法获取表单子字段字体的问题求助
解决PDF-lib获取含子字段表单的字体信息问题
当你遇到带有/Kids属性的表单字段时,这类字段是父容器字段,本身不存储字体信息,实际的字体配置在它的子Widget字段中。以下是具体的解决方法:
核心思路
- 识别带有
/Kids属性的父字段 - 通过PDF文档上下文解析
/Kids中的引用,获取子Widget字段 - 从子Widget的
DA(默认外观)属性中提取字体信息(PDF表单的字体通常嵌入在DA字符串里)
修改后的代码示例
<html> <head> <meta charset="utf-8" /> <script src="https://unpkg.com/pdf-lib/dist/pdf-lib.min.js"></script> </head> <script> const { PDFDocument } = PDFLib async function getFieldFonts() { const formUrl = 'https://partners.metas.global/Code39.pdf' const formPdfBytes = await fetch(formUrl).then(res => res.arrayBuffer()) const pdfDoc = await PDFDocument.load(formPdfBytes) const form = pdfDoc.getFields(); // 遍历所有字段,处理含子字段的情况 form.forEach(field => { const acroField = field.acroField; console.log(`字段名称: ${field.getName()}`); // 检查是否有子字段引用 if (acroField.get('Kids')) { const kidsRefs = acroField.get('Kids'); // 解析/Kids中的引用,获取子Widget对象 const childWidgets = kidsRefs.map(ref => pdfDoc.context.lookup(ref)); childWidgets.forEach((widget, index) => { console.log(`--- 子字段 ${index+1} 字体信息:`); // 从DA属性解析字体 const daString = widget.get('DA')?.toString(); if (daString) { // DA格式示例: "/Helv 12 Tf 0 g",提取字体名称部分 const fontMatch = daString.match(/\/(\w+)/); if (fontMatch) { console.log(`字体名称: ${fontMatch[1]}`); } else { console.log('未识别到字体信息'); } } else { console.log('无默认外观属性(DA)'); } }); } else { // 普通字段直接从DA提取字体 const daString = acroField.get('DA')?.toString(); if (daString) { const fontMatch = daString.match(/\/(\w+)/); console.log(`字体名称: ${fontMatch ? fontMatch[1] : '未识别'}`); } } }); } getFieldFonts(); </script> </html>
关键说明
pdfDoc.context.lookup(ref):用于解析PDF中的间接引用,把/Kids里的引用转化为实际的Widget对象DA属性:PDF表单字段的默认外观字符串,包含字体名称、字号、颜色等信息,格式类似/字体名 字号 Tf 颜色值 g,通过正则可以提取出字体名称- 父字段本身不存储字体,必须遍历子Widget才能拿到实际的字体配置
内容的提问来源于stack exchange,提问作者Collin Versluis
相关产品推荐
相关产品推荐

