You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pdf-lib.js无法获取表单子字段字体的问题求助

解决PDF-lib获取含子字段表单的字体信息问题

当你遇到带有/Kids属性的表单字段时,这类字段是父容器字段,本身不存储字体信息,实际的字体配置在它的子Widget字段中。以下是具体的解决方法:

核心思路

  1. 识别带有/Kids属性的父字段
  2. 通过PDF文档上下文解析/Kids中的引用,获取子Widget字段
  3. 从子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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:10:41