如何使用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
相关产品推荐
相关产品推荐

