【发布时间】:2018-07-03 11:05:05
【问题描述】:
在我所有的搜索和代码挖掘都没有帮助之后,我在这里寻求提示:
如何使用 Puppeteer PDF 生成设置文件的元数据(特别是标题和作者)?
我尝试在我的 HTML 中设置元标记,但它没有将这些输出到文件元数据中。
【问题讨论】:
-
尝试在文件中显示代码
标签: pdf metadata title puppeteer author
在我所有的搜索和代码挖掘都没有帮助之后,我在这里寻求提示:
如何使用 Puppeteer PDF 生成设置文件的元数据(特别是标题和作者)?
我尝试在我的 HTML 中设置元标记,但它没有将这些输出到文件元数据中。
【问题讨论】:
标签: pdf metadata title puppeteer author
Puppeteer 不具备编辑元数据或将元数据写入 PDF 的内置功能。
相反,您可以安装exiftool 命令行实用程序来编辑使用 Puppeteer 生成的 PDF 的元数据:
sudo apt install libimage-exiftool-perl
然后您可以在生成 PDF 后使用 Node.js child_process.exec() 函数从您的程序中调用命令行实用程序:
'use strict';
const puppeteer = require('puppeteer');
const exec = require('util').promisify(require('child_process').exec);
const execute = async command => {
const {stdout, stderr} = await exec(command);
console.log((stderr || stdout).trim());
};
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/');
await page.pdf({
path: 'example.pdf',
});
await execute('exiftool -title="Example PDF" -author="John Doe" /var/www/example.com/public_html/example.pdf');
await browser.close();
})();
【讨论】:
公认的答案是正确的,目前Puppeeter 不支持设置pdf 元数据。但我只是想提供一个使用节点包而不是本机库的解决方案:pdf-lib。
你需要:
PdfDocument
import puppeteer from 'puppeteer'
import { PDFDocument } from 'pdf-lib'
import fs from 'fs'
// generate pdf page as usual with puppeeter
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.setContent(`Some html`),
const puppeeterPdf = await page.pdf()
await browser.close()
// Give the buffer to pdf-lib
const pdfDoc = await PDFDocument.load(puppeeterPdf)
pdfDoc.setTitle('A title')
pdfDoc.setAuthor('An author')
const pdfBytes = await pdfDoc.save()
// write to disk
await fs.promises.writeFile('path/to/file.pdf', pdfBytes)
// send via http
res.send(Buffer.from(pdfBytes))
【讨论】:
Content-Disposition: inline; filename=myfile.pdf 被忽略,但 Content-Disposition: attachment; filename=myfile.pdf 正在工作,但用户无法在浏览器中看到 PDF 内联,必须将其保存到磁盘。