日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

node js批量导出PDF 导出压缩为zip 拆分设计 文件压缩 批量导出设计

發(fā)布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node js批量导出PDF 导出压缩为zip 拆分设计 文件压缩 批量导出设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

node導(dǎo)出pdf網(wǎng)上有不少介紹的文章,之前我也有過這方面的需求,總結(jié)一下遇到的問題,給大家點參考建議。

導(dǎo)出PDF大概會遇到以下幾個階段:

1、導(dǎo)出單個PDF文件

2、導(dǎo)出多個PDF文件

下面著重說一下第二種情況,第一種情況比較簡單,直接用phantomjs導(dǎo)出生成PDF即可。第二種情況,其實就是第一種情況的復(fù)雜化,我們先需要生成文件夾,在將生成的PDF放到文件夾中。這里有個問題,就是如果大數(shù)據(jù)同時導(dǎo)出生成會導(dǎo)致服務(wù)器內(nèi)存打滿,服務(wù)器掛掉,這種情況下必須得重啟服務(wù)器才行,連登錄都沒法登錄,死機了。我自己親測的一個導(dǎo)出3頁PDF的頁面大概會占用20MB左右的內(nèi)存,這個看你服務(wù)器多大了,我設(shè)置的是同時導(dǎo)出50個,50個成功后遞歸調(diào)用后續(xù)的,直到所有的都處理完。我把代碼粘上面供大家參考一下,并且加上必要注釋,同時上傳項目到GIT上,有疑問的朋友可以留言一起學(xué)習(xí)探討一下。GIT地址:https://github.com/seizeDev/node-pef

1、common.js

/*** Created by lizhen on 2017/11/13.*/ var commonJs = {}; exports.commonJs = commonJs; //導(dǎo)出時生成的文件戳 commonJs.reserverTime = function () {var thisDate = new Date();var nameDate = thisDate.getFullYear().toString() + (thisDate.getMonth() + 1).toString() + thisDate.getDate().toString() + thisDate.getHours().toString() + thisDate.getMinutes().toString();return nameDate };// 導(dǎo)出時生成的文件大小 commonJs.byteConversion = function (byte) {try {if (typeof byte == 'number') {var calByte = byte;var returnType = 'b';if (calByte > 1024) {calByte = calByte / 1024;returnType = 'KB'if (calByte>1024){calByte = calByte / 1024;returnType = 'MB'if(calByte>1024){calByte = calByte / 1024;returnType = 'GB'}}}return calByte+returnType;}} catch (err) {return err} };// 解析傳入的請求參數(shù) commonJs.parseResult = function(body) {var json = {};try {json = JSON.parse(body);} catch (e) {/*Error(e);console.log(Constant.ERROR, "解析返回數(shù)據(jù)出錯!返回數(shù)據(jù)為:", body);Res.end('{"code":500}');return;*/}var rs = json;return rs; };

2、userMsg.js

/*** Created by lizhen on 2017/11/13.*/ var userMsg = {}; //導(dǎo)出文件存放的地址 var dirPath = "/Users/lizhen/Desktop/resurce/export_policy"; userMsg.dirPath = dirPath;//導(dǎo)出文件的名字 userMsg.htmlMaps = {'居間服務(wù)協(xié)議': 'intermediary_agreement', } //導(dǎo)出服務(wù)器信息 const productionEnv = {hostname: '10.8.0.6',port: 8180,path: '/backstage/v1/sso/login' } userMsg.productionEnv = productionEnv; //用戶信息//'lizhen_export', 'lizhenniubi', 'backstage_user' userMsg.user = {username:'lizhen_export',pwd:'lizhenniubi',type:'backstage_user' } //當(dāng)前第幾條 userMsg.total = 0; // 導(dǎo)出返回給前端的下載路徑 userMsg.exporttUrl = 'http://www.baidu.com'; userMsg.dataMsg = null; userMsg.dataFile = null;exports.userMsg = userMsg;

3、exportMethod.js

/*** Created by lizhen on 2017/11/13.*/ var exportMethod = {}; exportMethod.exportPdf = function () {} //登錄成功后的回調(diào)生成PDF var exec = require('child_process').exec; var userMsg = require("../common/userMsg").userMsg; var logger = require("../log4js/logHelper").helper; var fs = require('fs'); exportMethod.loginCallback = function (data, order, pageHtml,yearRate , thisTime, cid ) {return new Promise(function (resolve, reject) {var productUrl = 'https://www.baidu.com';var url = null;if(!yearRate||yearRate === 'undefined'){url = `phantomjs savePdf.js "${productUrl}${pageHtml}.html?sid=${data.__sid}&timestamp=${data.timestamp}&signature=${data.signature}&orderNo=${order}&channel_id=${cid}" ${order} ${pageHtml} ${thisTime}`;}else{url = `phantomjs savePdf.js "${productUrl}${pageHtml}.html?sid=${data.__sid}&timestamp=${data.timestamp}&signature=${data.signature}&orderNo=${order}&yearRate=${yearRate}&channel_id=${cid}" ${order} ${pageHtml} ${thisTime}`;}logger.writeInfo(url);exec(url, {encoding: 'utf-8',timeout: 100000,maxBuffer: 200 * 1024,killSignal: 'SIGTERM',cwd: null,env: null},function (err, out) {userMsg.total += 1;var data = {total:userMsg.total,order}if (err) {console.log(err);data.success = false;data.message = err;resolve(data)} else {data.success = true;data.message = '請求成功'resolve(data)}});}) } /*** 全部都導(dǎo)出成功后壓縮整個文件夾* @type {commonJs}*/ var commonJs = require("../common/common").commonJs; exportMethod.gzipPaf = function (dataMsg,thisName,thisTime) {return new Promise(function (resolve, reject) {if (dataMsg == null) {dataMsg = '請求成功'}var fileName = thisName + thisTime;var archiver = require('archiver');//noinspection JSUnresolvedFunctionvar output = fs.createWriteStream(userMsg.dirPath + '/' + fileName + '.zip');//noinspection SpellCheckingInspectionvar archive = archiver('zip', {zlib: {level: 9} // Sets the compression level.});output.on('close', function () {logger.writeInfo('導(dǎo)出成功:總大小' + commonJs.byteConversion(archive.pointer()));//noinspection SpellCheckingInspectionvar rsolveData = {message: dataMsg,name: `${userMsg.exporttUrl}/${thisName}${thisTime}.zip`}resolve(rsolveData)});//noinspection JSUnresolvedFunctionarchive.on('warning', function (err) {//noinspection SpellCheckingInspectionif (err.code === 'ENOENT') {// log warning} else {// throw errorlogger.writeErr('導(dǎo)出錯誤:' + err);}});archive.on('error', function (err) {logger.writeErr('導(dǎo)出失敗:' + err);});archive.pipe(output);var fsDir = userMsg.dirPath + '/' + fileName;fs.readdirSync(fsDir).forEach(function (file) {var pathname = userMsg.dirPath + '/' + fileName + '/' + file;//noinspection JSUnresolvedFunctionarchive.append(fs.createReadStream(pathname), {name: file});});//noinspection JSUnresolvedFunctionarchive.finalize();}) }exportMethod.recursiveExport = function (orderList,config,thisName, rate, cid) {return new Promise(function (resolve, reject) {var thisTime = commonJs.reserverTime();logger.writeInfo(cid);/*** 如果沒有導(dǎo)出的文件夾,則創(chuàng)建文件夾*/if (!fs.existsSync(userMsg.dirPath + '/' + (thisName + thisTime))) {fs.mkdirSync(userMsg.dirPath + '/' + (thisName + thisTime));}orderList.forEach((order) => {exportMethod.loginCallback(config, order, thisName, rate, thisTime, cid).then(function (data) {logger.writeInfo(data);if (!data.success) {userMsg.dataMsg += `${data.order}導(dǎo)出失敗,請重新導(dǎo)出|`;userMsg.dataFile += `${thisName} + ${thisTime}|`;}//導(dǎo)出成功!if (data.total == orderList.length) {exportMethod.gzipPaf(userMsg.dataMsg,thisName,thisTime).then(exportMsg => {userMsg.total = 0;userMsg.dataMsg = null;userMsg.dataFile = null;resolve(exportMsg);})}});})}) };exports.exportMethod = exportMethod;

4、savePdf.js

var system = require('system'); var args = system.args; var url = args['1']; var name = args['2']; var filename = args['3']; var filetime = args['4']; var dirPath = "/Users/lizhen/Desktop/resurce/export_policy"; openPage(url);function openPage(url) {var page = require('webpage').create();page.open(url, function (status) {setTimeout(function () {console.log(status)if (status === "success") {page.paperSize = {format: 'A4',orientation: 'portrait',border: '1cm'};page.render(dirPath+'/'+(filename+filetime)+'/'+name + ".pdf");} else {console.log("Page failed to load.");}phantom.exit(0);}, 3000);}); } 5、logHelper.js /*** Created by lizhen on 2017/9/26.*/ var helper = {}; exports.helper = helper;var log4js = require('log4js');// 目錄創(chuàng)建完畢,才加載配置,不然會出異常 log4js.configure({appenders: { cheese: { type: 'file', filename: 'cheese.log' } },categories: { default: { appenders: ['cheese'], level: 'ALL' } } });var logDebug = log4js.getLogger('logDebug'); var logInfo = log4js.getLogger('logInfo'); var logWarn = log4js.getLogger('logWarn'); var logErr = log4js.getLogger('logErr');helper.writeDebug = function (msg) {if (msg == null)msg = "";logDebug.debug(msg); };helper.writeInfo = function (msg) {if (msg == null)msg = "";console.log(msg)logInfo.info(msg); };helper.writeWarn = function (msg) {if (msg == null)msg = "";console.log(msg)logWarn.warn(msg); };helper.writeErr = function (msg, exp) {if (msg == null)msg = "";if (exp != null)msg += "\r\n" + exp;console.log(msg)logErr.error(msg); };// 配合express用的方法 exports.use = function (app) {//頁面請求日志, level用auto時,默認(rèn)級別是WARNapp.use(log4js.connectLogger(logInfo, {level: 'debug', format: ':method :url'})); } 6、finlinkAgreement.js // var http = require("http"); var https = require("https"); var fs = require("fs"); var md5 = require("md5"); var express = require('express'); var logger = require("./log4js/logHelper").helper; var userMsg = require("./common/userMsg").userMsg; var commonJs = require("./common/common").commonJs; var exportMethod = require("./export/exportMethod").exportMethod; var log = require('./log4js/logHelper'); var app = express(); log.use(app); var exportHtml = null; var yearRate = null; var channelId = null; var exportList = []; var allList = []; app.get('/getPdf', function (req, res) {logger.writeInfo("開始記錄日志");userMsg.total = 0;logger.writeInfo('/getPdf');try {allList = req.query.order_nos.split(',');logger.writeInfo(allList);} catch(error) {res.send({'code':100,'message':'輸入的列表分隔符錯誤!'});logger.writeErr(req.query.order_nos);return;}exportHtml = req.query.html_name;yearRate = req.query.year_rate;channelId = req.query.channelId;logger.writeInfo(exportHtml);post(userMsg.user.username,userMsg.user.pwd,userMsg.user.type).then(function (result) {logger.writeInfo(result);res.send(result);}) }); var globalMsg = []; function post(username, pwd, type) {return new Promise(function (resolve, reject) {var params = {username: username,password: pwd,type: type};var options = {hostname: userMsg.productionEnv.hostname,port: userMsg.productionEnv.port,path: userMsg.productionEnv.path,method: 'POST',headers: {"Content-Type": 'application/json;charset=utf-8'}};//登錄var req = https.request(options, function (res) {var body = "";res.setEncoding('utf-8');res.on('data', function (chunk) {body += chunk;}).on("end", function () {var data = commonJs.parseResult(body);var config = {};var timestamp = (new Date()).valueOf();config.__sid = data.data.__sid;config.timestamp = timestamp;config.signature = md5(data.data.key + timestamp.toString());/*** 根據(jù)用戶傳入的HTML名字來判斷導(dǎo)出哪個文件,如果沒有的話,則默認(rèn)為intermediary_agreement* @type {string}*/var thisName = exportHtml ? userMsg.htmlMaps[exportHtml] : 'intermediary_agreement';function listTraverse(all,data,name,rate,cid) {var angentList = all.splice(0, 50);exportMethod.recursiveExport(angentList, data, name, rate, cid).then((exportMsg) => {globalMsg.push(exportMsg);logger.writeInfo(exportMsg);if (all.length > 50) {listTraverse(all, data, name)} else if (all.length > 0 && all.length <= 50) {listTraverse(all, data, name);all = [];} else {resolve(globalMsg)globalMsg = [];}})}listTraverse(allList,config,thisName, yearRate, channelId);});});req.write(JSON.stringify(params));req.end();}) }app.listen(8089, function () {console.log('監(jiān)聽8089') });

7、fileCopy.js

var fs=require('fs'); var exec = require('child_process').exec; var args = process.argv; var filePath, dirPath, outputdir; while(args.length){switch(args.shift()){case "-f":case "--file":filePath = args.shift();break;case "-d":case "--dir":dirPath = args.shift();break;case "-od":case "--outputdir":outputdir = args.shift();break;} }var dirs = fs.readdirSync(dirPath); var text = fs.readFileSync(filePath, 'UTF-8').match(/\S+/g);dirs.forEach(function(dir){for(var i=0, len=text.length;i<len;i++){if(new RegExp(text[i]).test(dir)){console.log(["xcopy", '"'+dirPath+"/"+dir+'"', '"'+outputdir+"/"+dir+'"', "/e /Y /I"].join(' '));exec(["xcopy", '"'+dirPath+"/"+dir+'"', '"'+outputdir+"/"+dir+'"', "/e /Y /I"].join(' '), function(dir, err){if(err){console.log("程序出錯!");throw err;}console.log(dir, "拷貝完成");}.bind(null, dirPath+"/"+dir));}} });

?

總結(jié)

以上是生活随笔為你收集整理的node js批量导出PDF 导出压缩为zip 拆分设计 文件压缩 批量导出设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。