【问题标题】:Puppeteer PDF Title and Author (metadata)Puppeteer PDF 标题和作者(元数据)
【发布时间】:2018-07-03 11:05:05
【问题描述】:

在我所有的搜索和代码挖掘都没有帮助之后,我在这里寻求提示:

如何使用 Puppeteer PDF 生成设置文件的元数据(特别是标题和作者)?

我尝试在我的 HTML 中设置元标记,但它没有将这些输出到文件元数据中。

【问题讨论】:

  • 尝试在文件中显示代码

标签: pdf metadata title puppeteer author


【解决方案1】:

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();
})();

【讨论】:

    【解决方案2】:

    公认的答案是正确的,目前Puppeeter 不支持设置pdf 元数据。但我只是想提供一个使用节点包而不是本机库的解决方案:pdf-lib

    你需要:

    • 使用 puppeteeter 生成 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))
    

    【讨论】:

    • 重要提示...无法设置文件名 chrome 总是从 URL 使用它 - 例如来自 URL example.com/file.pdf 文件名将是 file.pdf 但当 URL 没有扩展名时,例如不幸的是,example.com/somehash 文件名是 somehash.pdf,因此 URL 应始终以所需的文件名结尾。 Puppeteer 和 pdf-lib 没有设置文件名的选项。顺便说一句,标题 Content-Disposition: inline; filename=myfile.pdf 被忽略,但 Content-Disposition: attachment; filename=myfile.pdf 正在工作,但用户无法在浏览器中看到 PDF 内联,必须将其保存到磁盘。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多