首页 > 解决方案 > 使用 Puppeteer for PDF 的动态目录

问题描述

我一直在寻找解决方案,大多数答案都是不可能的。我已经看到 Paged.js(考虑使用它,但它似乎太大而且没有目的)设法使用

a::after { content: target-counter(attr(href), page, decimal); }

,更改那里的内容以填写 ToC 的正确页码。我猜这意味着他们已经创建了一个 css-polyfill 来在他们的库中修复这个问题?浏览器似乎不支持 target-counter 和 ::after。我不确定我在这里的想法是否正确 - 但我去寻找一个 css polyfill 来让目标计数器也为我工作(以及 page-break-after: 避免),因为 paged.js 似乎正在做它以这种方式。

无论如何,我一直在寻找的第二个选项是使用 PDF 解析器来解析 pdf 中的所有数据,并以某种方式使用正则表达式和循环以及其他 hacky 东西来查找我正在寻找的元素的页码。也许我会将解析器返回值放入 JSON 文件并从目录或其他内容中获取该 JSON 文件?听起来很慢,因为我还必须再合并一次 pdf。(已经为首页做了一次)

具体一点:我想知道这些解决方案中的一个或两个是否可行,如果可行,我希望有一些关于 A. 修复我需要的 CSS 标记的 polyfill 或 B. an对来自 pdf 解析器的数据进行排序和结构化的想法/方式。

标签: cssnode.jspdfpuppeteer

解决方案


对于选项 B,下面的脚本对于任何感兴趣的人来说都是一个好的开始。

const fs = require('fs');
const pdf = require('pdf-parse');
const { Readable } = require("stream");
let dataBuffer = fs.readFileSync('./generated.pdf');
pdf(dataBuffer).then(function(data) {
    let toc ={}, page;
    const pagePattern = /Page [0-9]+\/[0-9]+/;
    const topicPattern = /Title: [A-Za-z 0-9]+/;
    const lines = data.text.split('\n');
    lines.forEach((chunk, i, lines) => {
        if(chunk.match(pagePattern)) {
            page = chunk
        }
        if(chunk.match(topicPattern) && !toc[chunk]) {
            toc[chunk] = page
        }
    });
    console.log(toc); // Use this object to fill in values for your table of content
});

希望这会对某人有所帮助。


推荐阅读