成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

node獲取指定目錄下所有文件的內(nèi)容生成PDF

xeblog / 1496人閱讀

有個(gè)需求場(chǎng)景是需要把某個(gè)目錄下的所有指定文件的內(nèi)容生成pdf,因?yàn)槭乔岸碎_(kāi)發(fā),所以就用node來(lái)干活
首先是pdf的包是用pdfkit, 這里有兩個(gè)坑,第一個(gè)是生成的文件中可能會(huì)有系統(tǒng)無(wú)法識(shí)別的換行和空格,會(huì)被替換成莫名其妙的符號(hào),因此在拼接完內(nèi)容后,要使用 str.replace(/rn|r/g, "n")
進(jìn)行過(guò)濾,第二個(gè)坑是中文字符會(huì)亂碼,因此要引入中文ttf,例如
doc.font("./msyh.ttf") ;
接下來(lái)是獲取所有文件內(nèi)容,在一開(kāi)始我是判斷文件的長(zhǎng)度來(lái)識(shí)別是否結(jié)束,但是文件獲取是異步,遞歸的時(shí)候同時(shí)進(jìn)行這么多讀取操作,如何才能判斷所有異步操作都已經(jīng)結(jié)束了呢,答案就是我們的Promise.all啦
首先我們將fs模塊的幾個(gè)要用到方法promiseify化,也就是我們可以將異步操作包裝在promise函數(shù)中,由于文件操作的回調(diào)函數(shù)也是作為參數(shù)傳入(萬(wàn)能的JS),所以我們只要獲取到arguments中的callback函數(shù),并且根據(jù)成功或者失敗去resolve或reject就行啦,
那么Promise.all是用來(lái)干嘛呢?
Promise.all 接收一個(gè) promise 對(duì)象的數(shù)組作為參數(shù),當(dāng)這個(gè)數(shù)組里的所有 promise 對(duì)象全部變?yōu)閞esolve或 有 reject 狀態(tài)出現(xiàn)的時(shí)候,它才會(huì)去調(diào)用 .then 方法,它們是并發(fā)執(zhí)行的。也就是說(shuō)我們并行執(zhí)行的所有文件讀取操作,可以用Promise.all來(lái)解決啦!

const fs = require("fs")
const yargs = require("yargs")
const PDF = require("pdfkit")
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
const readFile = promisify(fs.readFile);
const doc = new PDF();

function uuid(times = 10) {
    let g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
        str = "";
    let len = g.length;
    for (let i = 0; i < times; i++) {
        str += g[Math.round((Math.random() * (len - 1)))];
    }
    return str;
}
let { path = "", name = uuid(), fileType = "" } = yargs.argv || {};
let str = "";

fileType = (fileType.split(",") || []).filter(item => item !== "")

function promisify(fn) {
    return function() {
        let args = Array.from(arguments);
        return new Promise(function(resolve, reject) {
            args.push(function(err, result) {
                if (err) {
                    reject(err);
                } else {
                    resolve(result);
                }
            });
            fn.apply(null, args);
        });
    }
}

function readDirRecur(file, callback) {
    return readdir(file).then(function(files) {
        files = files.map(function(filename) {
            let fullPath = `${file}/${filename}`;
            return stat(fullPath).then(function(stats) {
                let limmit = fileType.length ? fileType.find(item => filename.includes(`.${item}`)) : true;
                if (stats.isDirectory()) {
                    return readDirRecur(fullPath, callback);
                } else if (limmit) {
                    return readFile(fullPath, "utf8").then(function(data) {
                        callback(filename, data, fullPath);
                    });
                }
            })
        });
        return Promise.all(files);
    });
}
if (!path) return false;
readDirRecur(path, function(filename, data, fullPath) {
    str += data;
}).then(function() {
    str = str.replace(/
|
/g, "
");
    doc.pipe(fs.createWriteStream(`${name}.pdf`))
    doc.fontSize(10);
    doc.font("./msyh.ttf");
    doc.text(str, 50, 50);
    doc.end()
}).catch(function(err) {
    console.log(err);
});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108545.html

相關(guān)文章

  • 使用Node.js爬取任意網(wǎng)頁(yè)資源并輸出高質(zhì)量PDF文件到本地~

    摘要:上面只爬取了京東首頁(yè)的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴(kuò)大,需要爬取京東首頁(yè)中的所有標(biāo)簽對(duì)應(yīng)的跳轉(zhuǎn)網(wǎng)頁(yè)中的所有的文字內(nèi)容,最后放到一個(gè)數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無(wú)論是否有爬蟲(chóng)以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁(yè)資源,開(kāi)箱即用的配置 將爬取到的...

    seasonley 評(píng)論0 收藏0
  • 使用Node.js爬取任意網(wǎng)頁(yè)資源并輸出高質(zhì)量PDF文件到本地~

    摘要:上面只爬取了京東首頁(yè)的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴(kuò)大,需要爬取京東首頁(yè)中的所有標(biāo)簽對(duì)應(yīng)的跳轉(zhuǎn)網(wǎng)頁(yè)中的所有的文字內(nèi)容,最后放到一個(gè)數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無(wú)論是否有爬蟲(chóng)以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁(yè)資源,開(kāi)箱即用的配置 將爬取到的...

    xiaoxiaozi 評(píng)論0 收藏0
  • 使用Node.js爬取任意網(wǎng)頁(yè)資源并輸出高質(zhì)量PDF文件到本地~

    摘要:上面只爬取了京東首頁(yè)的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴(kuò)大,需要爬取京東首頁(yè)中的所有標(biāo)簽對(duì)應(yīng)的跳轉(zhuǎn)網(wǎng)頁(yè)中的所有的文字內(nèi)容,最后放到一個(gè)數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無(wú)論是否有爬蟲(chóng)以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁(yè)資源,開(kāi)箱即用的配置 將爬取到的...

    wangym 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<