使用Puppeteer for PDF的动态​​目录

时间:2019-09-23 12:57:03

标签: css node.js pdf puppeteer

我一直在寻找解决方案,大多数答案只是不可能。我已经看到Paged.js(考虑使用它,但是它看起来太大了而且没有用)可以使用

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

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

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

稍微具体一点:我想知道这两种解决方案中的一种还是两种都可行,如果可行,我很喜欢A上的一些指针。polyfill可修复我需要的CSS标签,或者B.对pdf解析器中的数据进行排序和结构化的想法/方式。

1 个答案:

答案 0 :(得分:0)

对于选项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
});

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