【微信小程序开发】多图片转pdf(可带水印)

一、首先需要在小程序中安装两个模块,直接使用npm:

npm install pdf-lib;

npm install @pdf-lib/fontkit;

二、微信开发着工具左上角,点击:构建npm。

 到了这里基本上就完成一半了,下面直接上代码

在utils文件新建pdf.js文件,这个可以随意起名

文件代码:

    async function pdfFn(imgArr, isWatermark) {
        const {
            PDFDocument,
            rgb
        } = require('pdf-lib'); //引入pdf-lib模块,转成pdf的时候用到
        const {
            fontkit
        } = require('@pdf-lib/fontkit') //引入@pdf-lib/fontkit模块,水印的时候用到
        //接收小程序端传来的图片数组
        let img_arr = imgArr;
        //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 sBase64 = wx.getFileSystemManager().readFileSync(lian, 'base64');
            arr.push(sBase64);
        };

        // //获取所有照片组成的高度和宽度
        for (let j = 0; j < arr.length; j++) {
            //判断图片是png
            if (img_arr[j].match(/.png/g)) {
                let img = await doc.embedPng(arr[j]);
                //计算图片展示的宽高,根据原有的比例和pdf的宽度来算
                let h = (img.height * 700) / img.width;
                let obj = {
                    img: img,
                    width: 700,
                    height: h,
                };
                content_arr.push(obj);
                zheight = parseInt(zheight + h);
            };
            //判断图片是jpg
            if (img_arr[j].match(/.jpg/g)) {
                let img = await doc.embedJpg(arr[j]);
                //计算图片展示的宽高,根据原有的比例和pdf的宽度来算
                let h = (img.height * 700) / img.width;
                let 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].height
            let height = zheight - guodu_height
            page.drawImage(content_arr[i].img, {
                x: 50, //左右各间隔50
                y: height,
                width: content_arr[i].width,
                height: content_arr[i].height,
            });
        };
        // 嵌入水印,水印不能中文,不然会报错
        if (isWatermark==1) {
            page.moveTo(100, zheight / 2);
            page.drawText(`Identification Assistant \n` +
                `\n` +
                `version: 1.0.12 \n`, {
                    size: 50,
                    color: rgb(1, 0, 0),
                });
            page.moveDown(100);
            page.drawText('Exclusive Watermark', {
                size: 40,
                color: rgb(1, 0, 0),
            });
        };
        const docBase64 = await doc.saveAsBase64();
        return {
            docBase64,
        };
    }


    module.exports = {
        pdfFn
    }

在需要的地方引入,比如:

使用:

onIdentify() {
        var that = this;
        wx.chooseMedia({
            count: 9,
            mediaType: ['image'],
            sourceType: ['album', 'camera'],
            success: (res) => {
                const imagePath = res.tempFiles.map(res => {
                    return res.tempFilePath
                })
                pdfFn(imagePath,2).then((resl) => {
                    var fs = wx.getFileSystemManager();
                    fs.writeFile({
                        filePath: wx.env.USER_DATA_PATH + "/" + 'pdf名字.pdf',
                        data: resl.docBase64,
                        encoding: "base64",
                        success: resx => {
                            wx.openDocument({
                                filePath: wx.env.USER_DATA_PATH + "/" + 'pdf名字.pdf',
                                showMenu: true,
                                success: function (resxl) {
                                    console.log(resxl);
                                },
                                fail(err) {
                                    console.log(err);
                                }
                            })
                        }
                    })
                })
            }
        })
    },
这里需要使用wx.chooseMedia从本地或相机获取图片的临时文件路径,将文件路径传给pdfFn函数,pdfFn接受两个参数,一个是图片的临时文件路径(数组),一个的是否追加水印(1为追加,其他不追加);具体可以自行去改pdf.js文件,都写了注释,很好理解。其他一些基础的的就不一一讲解了,有不懂的可以问我。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 微信小程序开发是指利用微信开发者工具和相关开发技术,开发出符合微信小程序平台的应用程序。微信小程序具有轻量化、快速启动、低资源占用等特点,被广泛用于各类行业的应用开发。在开发过程中,有许多教程和案例供开发者参考学习。 图解案例教程是一种以图文结合方式呈现的教学材料,通过图示和文字详细介绍了每一个开发步骤,方便初学者理解和操作。有关微信小程序开发的图解案例教程,通常会包含如下内容: 1. 准备工作:介绍如何下载和安装微信开发者工具以及其他必要的开发环境。 2. 界面设计:介绍如何使用微信小程序提供的组件和样式,设计小程序的界面布局和风格。 3. 数据交互:介绍如何通过微信小程序提供的API实现与后台服务器的数据交互,包括发送请求、接收响应等操作。 4. 功能实现:介绍如何使用微信小程序提供的API实现各种功能,比如图片轮播、下拉刷新、地理位置定位等。 5. 调试和发布:介绍如何使用微信开发者工具进行小程序的调试和测试,以及如何将小程序发布到线上供用户使用。 在学习微信小程序开发的过程中,利用图解案例教程可以更直观地理解和掌握相关知识和技巧。通过实际操作案例的演示和讲解,开发者可以更快速地上手并运用到自己的项目中。同时,图解案例教程也有助于培养学习者的解决问题的能力和独立思考能力。 总之,微信小程序开发图解案例教程是一种简洁明了、易于理解和操作的学习资料,对于想要入门微信小程序开发的人来说,是一种很好的学习资源。 ### 回答2: 微信小程序开发是一种快速、灵活、便捷的应用程序开发方式,可以满足不同用户的个性化需求。对于想要深入学习微信小程序开发的人来说,图解案例教程pdf是非常有帮助的资源。 首先,图解案例教程能够提供直观的视觉效果,通过图文并茂的方式让开发者更好地理解和掌握微信小程序开发的基本知识、流程和技巧。有时候,文字描述可能会比较抽象,但是通过图解,可以让开发者更加直观地了解具体的实现过程,提升学习效果。 其次,图解案例教程能够帮助开发者更好地理解微信小程序开发的逻辑和思维方式。通过观察图解案例中的各个模块、组件和交互效果,开发者可以加深对微信小程序框架和组件的理解,从而更好地进行自己的开发工作。 最重要的是,图解案例教程pdf可以作为开发者的参考手册,供他们在实际开发过程中查阅和使用。遇到问题时,可以通过图解案例中的具体示例进行参考和解决,提高开发效率和准确性。 总而言之,微信小程序开发图解案例教程pdf是一种很好的学习资源,可以帮助开发者更好地理解和掌握微信小程序开发的知识和技巧。通过图文并茂的方式,提供直观的视觉效果和实例,对于想要深入学习微信小程序开发的人来说,是非常有帮助的。 ### 回答3: 微信小程序开发是一种基于微信平台的应用程序开发方式,通过微信开发工具可以创建和调试小程序小程序具有占用空间小、使用方便快捷等特点,因此受到了许多开发者和用户的喜爱。 如果你对微信小程序开发感兴趣,我建议你可以寻找一些图解案例教程PDF来学习。这些教程通常会以图文结合的方式,通过实际案例来演示如何开发微信小程序。 首先,你可以在网上搜索相关的图解案例教程PDF,比如在微信公众平台上可以找到一些官方提供的教程资源。这些教程一般会从基础入门开始,逐渐深入介绍小程序开发的各个方面,包括界面设计、数据交互、接口调用等。通过图文结合的方式,你可以更加直观地理解每一个步骤和概念。 其次,你也可以考虑购买一些专门的微信小程序开发书籍,这些书籍通常也会提供一些图解案例教程。在书籍中,你可以找到更加系统和完整的学习内容,涵盖了更多的开发技巧和实战经验。 最后,你还可以参考一些在线的视频教程,一些视频教程内容更加生动有趣,通过实际操作演示来帮助你更好地理解和掌握微信小程序开发的技能。 总之,通过寻找图解案例教程PDF来学习微信小程序开发是一个不错的选择。希望你能够通过这种方式获得对微信小程序开发的全面了解,并能够成功开发出自己的小程序项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值