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

如何使用JavaScript库pdf-lib提取PDF自定义元数据?

使用pdf-lib提取PDF自定义元数据的解决方案

问题描述

使用pdf-lib(v1.5.0)提取PDF元数据时,标题、作者等常规元数据能正常获取,但自定义元数据(例如键为"CUSTOMKEY"、值为"1234"的条目)无法提取。尝试调用pdfDoc.getCustomKey()时出现报错,需解决自定义元数据的提取问题。

现有代码示例

HTML

<html>
  <head>
    <meta charset="utf-8" />
    <script src="https://unpkg.com/pdf-lib@1.5.0"></script>
  </head>

  <body>
    <p>点击按钮读取PDF元数据(使用<code>pdf-lib</code>)</p>
    <button onclick="readPdfMetadata()">读取PDF元数据</button>
    <ul id="metadata-list"></ul>
  </body>
</html>

JavaScript

const { PDFDocument } = PDFLib

async function readPdfMetadata() {
    // 获取PDF文件
  const pdfUrl = 'https://pdf-lib.js.org/assets/with_cropbox.pdf';
  const pdfBytes = await fetch(pdfUrl).then((res) => res.arrayBuffer());

  // 加载PDF文档,不更新现有元数据
  const pdfDoc = await PDFDocument.load(pdfBytes, { 
    updateMetadata: false 
  })

        // 读取常规元数据字段      
  const title = pdfDoc.getTitle();
  const author = pdfDoc.getAuthor();
  const subject = pdfDoc.getSubject();
  const creator = pdfDoc.getCreator();
  const keywords = pdfDoc.getKeywords();
  const producer = pdfDoc.getProducer();
  const creationDate = pdfDoc.getCreationDate();
  const modificationDate = pdfDoc.getModificationDate();
//   const customkey = pdfDoc.getCustomKey(); // 该方法不存在,会报错
  
        // 显示所有常规元数据字段   
  document.getElementById('metadata-list').innerHTML = `
    <li>文档: ${pdfUrl}</li>
    <li>标题: ${title}</li>
    <li>作者: ${author}</li>
    <li>创建者: ${creator}</li>
    <li>关键词: ${keywords}</li>
    <li>生成器: ${producer}</li>
    <li>创建日期: ${creationDate.toISOString()}</li>
    <li>修改日期: ${modificationDate.toISOString()}</li>
  `;
}

解决方案

pdf-lib v1.x版本并未提供getCustomKey()这类直接获取单个自定义元数据的方法,这是调用该方法报错的核心原因。要提取自定义元数据,需通过pdfDoc.getMetadata()方法获取完整元数据对象,其中的custom字段以键值对形式存储所有自定义元数据。

修改后的JavaScript代码如下:

const { PDFDocument } = PDFLib

async function readPdfMetadata() {
    const pdfUrl = 'https://pdf-lib.js.org/assets/with_cropbox.pdf';
    const pdfBytes = await fetch(pdfUrl).then((res) => res.arrayBuffer());

    const pdfDoc = await PDFDocument.load(pdfBytes, { 
        updateMetadata: false 
    })

    // 读取常规元数据
    const title = pdfDoc.getTitle();
    const author = pdfDoc.getAuthor();
    const subject = pdfDoc.getSubject();
    const creator = pdfDoc.getCreator();
    const keywords = pdfDoc.getKeywords();
    const producer = pdfDoc.getProducer();
    const creationDate = pdfDoc.getCreationDate();
    const modificationDate = pdfDoc.getModificationDate();

    // 读取自定义元数据
    const metadata = pdfDoc.getMetadata();
    const customMetadata = metadata.custom;

    // 构建显示内容
    let metadataHtml = `
        <li>文档: ${pdfUrl}</li>
        <li>标题: ${title}</li>
        <li>作者: ${author}</li>
        <li>创建者: ${creator}</li>
        <li>关键词: ${keywords}</li>
        <li>生成器: ${producer}</li>
        <li>创建日期: ${creationDate.toISOString()}</li>
        <li>修改日期: ${modificationDate.toISOString()}</li>
    `;

    // 添加自定义元数据到显示内容
    if (Object.keys(customMetadata).length > 0) {
        metadataHtml += '<li><strong>自定义元数据:</strong></li>';
        for (const [key, value] of Object.entries(customMetadata)) {
            metadataHtml += `<li>${key}: ${value}</li>`;
        }
    } else {
        metadataHtml += '<li>无自定义元数据</li>';
    }

    document.getElementById('metadata-list').innerHTML = metadataHtml;
}

关键说明

  • pdfDoc.getMetadata()返回的对象包含PDF所有元数据,其中custom属性专门存储自定义键值对。
  • 若目标PDF无自定义元数据,custom会是空对象,此时可添加提示信息。
  • 自定义元数据的键区分大小写,需确保与PDF中实际存储的键完全匹配。

内容的提问来源于stack exchange,提问作者UIAPPDEVELOPER

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:50:57