最近在做项目的时候,碰到一个功能需要多张图片转成pdf的功能,首先,在网上找了很多资料,都没有一个合适的。

后来,就自己动手使用云函数写了一个处理图片转成pdf的云函数,而且需带水印。

直奔主题,使用的是微信小程序云开发里面的云函数,是基于node.js写的

先看效果:

看完整代码,都有详细注释!!!

// 云函数多张图片 转成 pdf
//引入模块之前,记得先install安装模块哈,熟悉nodejs的安装模块不难,不懂的百度一下
const cloud = require('wx-server-sdk');
const { PDFDocument, StandardFonts, rgb } = require('pdf-lib');  //引入pdf-lib模块,转成pdf的时候用到
const {fontkit} = require('@pdf-lib/fontkit')    //引入@pdf-lib/fontkit模块,水印的时候用到cloud.init({env:'你的环境id'  //填入你的环境id
});// 云函数入口函数
exports.main = async (event, context) => {//接收小程序端传来的图片数组let img_arr  =event.img_arr;//arr是用来存储fileContent的数组let arr = []//pdf的总高度,是等于数组里面的所有图片的高度之和let zheight = 0//用来存储处理过后的各个图片信息的数组let content_arr = []const doc = await PDFDocument.create();let page = doc.addPage();doc.registerFontkit(fontkit)//下载图片 获取fileContent,并且存入arr数组for (let i = 0; i < img_arr.length; i++) {let lian = img_arr[i]let lenderSignSign = await cloud.downloadFile({fileID:lian});//concat是数组直接的拼接,这里需要使用push,这是个开发习惯导致的坑arr.push(lenderSignSign.fileContent)          }//获取所有照片组成的高度和宽度for (let j = 0; j < arr.length; j++) {//判断图片是pngif(img_arr[j].match(/.png/g)){let img = await doc.embedPng(arr[j]);//计算图片展示的宽高,根据原有的比例和pdf的宽度来算let h = (img.height*700)/img.widthlet obj ={img:img,width:700,height:h,}content_arr.push(obj)zheight =parseInt(zheight + h)}//判断图片是jpgif(img_arr[j].match(/.jpg/g)){let img = await doc.embedJpg(arr[j]);//计算图片展示的宽高,根据原有的比例和pdf的宽度来算let h = (img.height*700)/img.widthlet obj ={img:img,width:700,height:h,}content_arr.push(obj)zheight =parseInt(zheight + h)}//判断如果图片不是png或者jpg。则返回提示if(!img_arr[j].match(/.jpg/g)&&!img_arr[j].match(/.png/g)){let str = '图片只支持jpg和png格式'return str}}//开始设置pdf的高度和宽度page.setWidth(800);page.setHeight(zheight);//guodu_height用来存储排在前面的高度let guodu_height = 0//开始绘制for (let i = 0; i < content_arr.length; i++) {guodu_height = guodu_height + content_arr[i].heightlet height = zheight - guodu_heightpage.drawImage(content_arr[i].img,{x: 50,           //左右各间隔50y: height,width:content_arr[i].width,height:content_arr[i].height,});}// 定义水印的字体const customFont = await doc.embedFont(StandardFonts.Helvetica)// 定义水印,水印不能中文,不然会报错const text = 'this is ziwenlu'const textSize = 20// 嵌入水印page.drawText(text, {x: 0,y: 0,size: textSize,font:customFont,opacity: 0.5,color: rgb(0, 0.53, 0.71),})const docBase64 = await doc.saveAsBase64()const docBuffer = Buffer.from(docBase64, 'base64');//表明这个pdf是存放在云存储里面带的tmp文件夹,后面是给pdf取名称let fileName = 'tmp/' + parseInt(new Date().getTime() / 1000) + '.pdf';//开始上传到云存储let result = await cloud.uploadFile({ cloudPath: fileName, fileContent: docBuffer });let fileID = result.fileID;//转http访问const fileList = await cloud.getTempFileURL({fileList: [fileID],});let pdf = fileList.fileList[0].tempFileURL;return { code: 1, msg: '', data: { fileID: fileID, pdf: pdf } }}

这就是完整的云函数代码。不过这个处理有点点耗时,再加上云函数的冷启动缺点,云函数的请求超时时间默认是3秒,所以建议把云函数的请求超时时间改为10秒,这样就不会请求超时了,测试过还是挺快的。

end

【微信小程序云开发】使用云函数(node.js)实现多张图片转成pdf的功能,且pdf带水印相关推荐

  1. python写微信小程序商城_Python(Django 2.x)+Vue+Uniapp微信小程序商城开发视频教程

    重要的事儿说在前面: 这并非是一个基础课程,请没有相关技术基础知识的同学先学一下基础知识. 本次分享虽然使用Uni-app这个"开发一次,多端覆盖"的框架,但只会给大家分享演示&q ...

  2. 【微信小程序-原生开发】实用教程09 - 可滚动选项,动态列表-步骤条(含事件传参),动态详情(含微信云查询单条数据 doc)

    开始前,请先完成圆梦宝典中滚动公告栏的开发,详见 [微信小程序-原生开发]实用教程 08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据 ...

  3. 微信小程序——传统开发模式与云开发模式对比

    目  录 1.传统开发模式与云开发模式的对比图 2.云开发技术能力说明 3.云开发技术特点 1.传统开发模式与云开发模式的对比图 通过传统开发模式与云开发模式的对比图可以看出传统开发模式需要开发者关注 ...

  4. 微信小程序图片无法存入云开发数据库,求解决

    微信小程序图片无法存入云开发数据库,求解决 上传图片的js代码片段 上传图片的js代码片段 上传图片的js代码片段,觉得自己代码的没错,也能打印出来上传的图片地址,但是发现并没有存进数据库,求大神指点 ...

  5. 微信小程序:全新独家云开发微群人脉

    今天给大家带来一款云开发版本的微群人脉小程序源码 该版本属于采集版本(群二维码自动采集) 该版本属于云开发版本(免服务器和域名) 这是一款不怕封小程序版本 PS:支持用户自主发布那一款还是有点危险因为 ...

  6. 【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏

    开始前,请先完成圆梦宝典中宫格导航的开发,详见 [微信小程序-原生开发]实用教程 07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字) https://blog.csdn.net ...

  7. 微信小程序接入腾讯云IM即时通讯(获取聊天历史记录开发步骤)

    微信小程序接入腾讯云IM即时通讯(获取聊天历史记录开发步骤) 1.先看文档: 获取 C2C 历史消息 :https://cloud.tencent.com/document/product/269/1 ...

  8. 微信小程序开通腾讯云开发环境

    目录 微信小程序开通"腾讯云"开发环境 注册腾讯云账号 配置开发环境 微信小程序开通"腾讯云"开发环境 这里强调以下,标题是"腾讯云"开发环 ...

  9. 微信小程序应用开发赛作品综合开发记录——晋鹿文旅(云开发——概览)

    文章目录 前言 作品展示: 1.设计理念: 2.1.风景/人文历史 2.2.文物园 2.3.志愿者(暂未对接任何活动,仅测试) 2.4.英汉传译(考虑到可能在旅行中外国友人或者单纯就想翻译) 2.5. ...

  10. 微信小程序集成腾讯云 IM SDK

    1.背景 因业务功能需求需要接入IM(即时聊天)功能,一开始想到的是使用 WebSocket 来实现这个功能,然天意捉弄(哈哈)服务器版本太低不支持 wx 协议(也就不支持 WebSocket了)不得 ...

最新文章

  1. EduCoder Linux之文件/目录搜索
  2. 从新冠疫情出发,漫谈 Gossip 协议
  3. React全家桶构建一款Web音乐App实战(九):皮肤切换
  4. 《软件项目管理(第二版)》第 6 章——项目质量管理 重点部分总结
  5. informix(南大通用)sql语法的差异
  6. 红帽企业linux7 u盘安装,RedHat企业版7 “yum”重装 CentOS7 “yum”
  7. Android NFC详解
  8. Swift中数组字典和plist文件的转换
  9. python str转为list,dict,tuple等 eval,exec,
  10. C++ damo_5_继承中的异常_异常的层次结构 20180316 day8
  11. 群内2018_4月讨论整理2
  12. ssh或scp报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  13. android型号手机怎么截图,如何在Android手机上屏幕截图(仅限Rooted Phone) | MOS86...
  14. 西门子PLC能否实时无线采集多处从站模拟量数据?
  15. 几经波折的Ubuntu安装tensorflow
  16. 原码、反码、补码及补码转原码
  17. Oday安全 12.3.1Ret2Libc实战之利用ZwSetInformationProcess一节注记(上)
  18. MySQL主键(primary key)的作用
  19. 【频带传输】数字频带传输系统之不同调制方式的误码率与频谱特性总结
  20. HTML标签大全,存起来总有一天用的上

热门文章

  1. ASCII码表(美国标准信息交换标准码)
  2. Python 中文的输入
  3. ReactiveCocoa Documents 翻译(基于版本V2.5)
  4. [转载]CodeGear RAD 2007 SP4 最新下载及破解
  5. 怎么学习oracle浅析
  6. 无法启动Microsoft Office Outlook 无法打开 Outlook窗口
  7. 计算机windows7桌面管理,windows7桌面图标【管理要领】
  8. TestDirector用户手册
  9. TestDirector简介
  10. SAP MM 采购预付款管理初探