有個需求場景是需要把某個目錄下的所有指定文件的內容生成pdf,因為是前端開發,所以就用node來干活
首先是pdf的包是用pdfkit, 這里有兩個坑,第一個是生成的文件中可能會有系統無法識別的換行和空格,會被替換成莫名其妙的符號,因此在拼接完內容后,要使用 str.replace(/rn|r/g, "n")
進行過濾,第二個坑是中文字符會亂碼,因此要引入中文ttf,例如
doc.font("./msyh.ttf") ;
接下來是獲取所有文件內容,在一開始我是判斷文件的長度來識別是否結束,但是文件獲取是異步,遞歸的時候同時進行這么多讀取操作,如何才能判斷所有異步操作都已經結束了呢,答案就是我們的Promise.all啦
首先我們將fs模塊的幾個要用到方法promiseify化,也就是我們可以將異步操作包裝在promise函數中,由于文件操作的回調函數也是作為參數傳入(萬能的JS),所以我們只要獲取到arguments中的callback函數,并且根據成功或者失敗去resolve或reject就行啦,
那么Promise.all是用來干嘛呢?
Promise.all 接收一個 promise 對象的數組作為參數,當這個數組里的所有 promise 對象全部變為resolve或 有 reject 狀態出現的時候,它才會去調用 .then 方法,它們是并發執行的。也就是說我們并行執行的所有文件讀取操作,可以用Promise.all來解決啦!
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); });
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108545.html
摘要:上面只爬取了京東首頁的圖片內容,假設我的需求進一步擴大,需要爬取京東首頁中的所有標簽對應的跳轉網頁中的所有的文字內容,最后放到一個數組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無論是否有爬蟲以及Node.js基礎的朋友觀看~ 需求: 使用Node.js爬取網頁資源,開箱即用的配置 將爬取到的...
摘要:上面只爬取了京東首頁的圖片內容,假設我的需求進一步擴大,需要爬取京東首頁中的所有標簽對應的跳轉網頁中的所有的文字內容,最后放到一個數組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無論是否有爬蟲以及Node.js基礎的朋友觀看~ 需求: 使用Node.js爬取網頁資源,開箱即用的配置 將爬取到的...
摘要:上面只爬取了京東首頁的圖片內容,假設我的需求進一步擴大,需要爬取京東首頁中的所有標簽對應的跳轉網頁中的所有的文字內容,最后放到一個數組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無論是否有爬蟲以及Node.js基礎的朋友觀看~ 需求: 使用Node.js爬取網頁資源,開箱即用的配置 將爬取到的...
閱讀 2100·2021-11-11 16:55
閱讀 3171·2021-10-11 10:58
閱讀 3038·2021-09-13 10:28
閱讀 3967·2021-07-26 23:57
閱讀 1005·2019-08-30 15:56
閱讀 1331·2019-08-29 13:15
閱讀 1258·2019-08-26 18:18
閱讀 1266·2019-08-26 13:44