JS将图片转pdf,jspdf的使用

news2024/9/22 23:21:01

Hi I’m Shendi

最近做转换工具,需要将图片转pdf,这里记录下来


JS将图片转pdf,jspdf的使用




简介

A library to generate PDFs in JavaScript.

一个用JavaScript生成PDF的库。



下载

在网站或github下载

https://parall.ax/products/jspdf

https://github.com/parallax/jsPDF

解压后在在页面内引入 dist 下的 jspdf.umd.min.js 文件



使用

官方文档是通过以下方式获取 jsPDF

import { jsPDF } from "jspdf";

但是我使用的是原生,找不到办法就只能自己摸索,首先是在控制台看有什么全局变量,发现有一个名称为 jspdf 的变量,这个变量下有一个名为 jsPDF 的函数,经过尝试,使用这个函数就可以获取到实例了

在这里插入图片描述



然后可以看官方文档说的进行尝试

在这里插入图片描述


var doc = jspdf.jsPDF();
doc.text("Hello world", 10, 10);
doc.save("生成.pdf");

执行后,会自动下载pdf文件,文件打开后内容效果如下

在这里插入图片描述



API文档: http://raw.githack.com/MrRio/jsPDF/master/docs/index.html

这个API文档比较详细,但是网站有时候不稳定…可能因为墙的原因



添加图片

我的目的是将图片转pdf,找到了addImage函数,将图片写入pdf

api文档定义如下

(inner) addImage(imageData, format, x, y, width, height, alias, compression, rotation)

第一个参数为图片,可以为链接、字节等,第二个参数为图片格式,第三和第四代表图片编写到当前页的哪个位置,第五和第六代表绘制图片的宽高,更多的参考api文档


例如我将用户上传的图片加入pdf,file为上传的文件,sw.getObjectURL将文件转链接

var pdf = jspdf.jsPDF();
pdf.addImage(sw.getObjectURL(file), "jpeg", 0, 0);

效果如下

在这里插入图片描述



添加页

当内容超出pdf页的高度就需要新增一个页了

在api文档中可以轻易的找到一个名为 addPage 的函数,执行后保存,发现增加了一个pdf页面

在这里插入图片描述


添加页后默认当前页为添加的页面,定义如下

addPage(format, orientation)

其中format代表新建页的格式,默认为A4,还可以为

  • a0 - a10
  • b0 - b10
  • c0 - c10
  • dl
  • letter
  • government-letter
  • legal
  • junior-legal
  • ledger
  • tabloid
  • credit-card

如果需要自定义大小的话直接传递数组就可以了,例如宽200高500

addPage([200,500]);

第二个参数为方向,portrait(纵向),landscape(landscape),或缩写p,l


页面操作

有多页的话就需要有与之对应的操作,例如页面总数,切换页面等

在控制台中查看

在这里插入图片描述


其中 getNumberOfPages 是总页数,setPage 是设置当前操作哪一页,从1开始

还有 getPageWidth,getPageHeight 获取页宽高

setPageWidth,setPageHeight设置页面宽高,第一个参数为页下标,同setPage,从1开始,第二个参数为设置的值

要获取当前选择的是哪一页可以通过 getCurrentPageInfo 来得到当前页的信息,其中有一个 pageNumber 代表当前页数

知道了这些,就可以实现我的目的了



图片自适应

当图片过大会被遮住,所以直接将图片宽度设置为100%,高度根据图片宽高比来进行调整

这样只有高度超出的问题了


高度超过的话就将剩余部分放到第二页,比如一页的高度为100,图片的高度为220,那么总共有三页,第一页是展示图片的上100像素,第二页展示100-200的像素,第三页展示200-220的像素


这部分比较烧脑,只能做根据效果来调整,最终思路如下

记录两个信息,一个图片占用页面的高度(可能多页面),一个当前页面还剩多少高度(用于后面图片在其后位置添加)

计算图片可以占多少页,根据此来循环,代码如下

var pdf = jspdf.jsPDF();
var splitY = 0, splitHeight = 0,
    pageWidth = 210,
    pageHeight = 297;

pdf.setPageWidth(1, pageWidth);
pdf.setPageHeight(1, pageHeight);

// file是上传的文件files[0],有多个文件需要多次处理,这里只做示例
// 这个地方是我自己封装的读取图片文件的库(ShendiWeb),可以自己通过FileReader去读取
sw.readImg(file, function (img) {
    // 获取宽高比. 调整宽度让高度除以宽高比即可
    var ratio = img.width / img.height;
    var height = pageWidth / ratio;

    // 计算图片占多少页
    var num = parseInt((height + splitY) / pageHeight);
    for (var z = 0; z <= num; z++) {
        pdf.addImage(img, "jpeg", 0, splitY - splitHeight, pageWidth, height);
        if (height + splitY - splitHeight >= pageHeight) {
            pdf.addPage([pageWidth,pageHeight]);
            splitHeight += pageHeight - splitY;
            splitY = 0;
        } else {
            splitY = height % pageHeight;
            splitHeight = 0;
        }
    }
});

pdf.save();

我制作了两张图,宽度都为210,一张橙色高度400,一张灰色高度600,效果如下

在这里插入图片描述


这样我的目的就实现了




END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像增强之图像锐化(边缘增强)之sobel算子

note matx (-1,0,1;-2,0,2;-1,0,1) maty (-1,-2,-1;0,0,0;1,2,1) code // 图像增强之图像锐化(边缘增强)之sobel算子 void GetSobelMat(Mat& sobelX, Mat& sobelY) {sobelX (Mat_<int>(3,3) << -1,0,1,-2,0,2,-1,0,1);sobelY (Mat_<int>(3,3…

【面试】数据仓库

数据分层 维度建模 (0) 什么是维度建模&#xff1f; 维度建模以分析决策的需求出发构建模型&#xff0c;构建的数据模型为分析需求&#xff08;也就是我们通常所说的数据分析&#xff09;服务。它重点解决如何更快速完成分析需求&#xff0c;同时还有较好的大规模复杂查询的响…

品达通用权限系统-Day01

文章目录 1. 项目概述1.1 项目介绍1.2 业务架构1.3 技术架构1.4 环境要求 2. Spring Boot starter2.1 starter介绍2.2 starter原理2.2.1 起步依赖2.2.2 自动配置2.2.2.1 基于Java代码的Bean配置2.2.2.2 自动配置条件依赖2.2.2.3 Bean参数获取2.2.2.4 Bean的发现2.2.2.5 Bean的加…

NXP i.MX 8M Plus工业开发板规格书(四核ARM Cortex-A53 + 单核ARM Cortex-M7,主频1.6GHz)

1 评估板简介 创龙科技TLIMX8MP-EVM是一款基于NXP i.MX 8M Plus的四核ARM Cortex-A53 单核ARM Cortex-M7异构多核处理器设计的高性能工业评估板&#xff0c;由核心板和评估底板组成。ARM Cortex-A53(64-bit)主处理单元主频高达1.6GHz&#xff0c;ARM Cortex-M7实时处理单元主…

【Java】如何在 Java 中使用条件运算符

本文仅供学习参考&#xff01; 相关教程地址&#xff1a; http://c.biancheng.net/view/792.html https://www.cnblogs.com/bmbm/archive/2012/01/16/2342239.html 在软件开发中&#xff0c;运算符处理表达式中的一个或多个操作数。Java 编程语言支持以下类型的运算符&#xff…

HTML5、JS实现元素拖拽排序

先介绍一下html5的drag属性,拖放&#xff08;Drag 和 drop&#xff09;是 HTML5 标准的组成部分。想要启用drag&#xff0c;只要给元素加上draggable"true"就行了&#xff08;Safari 5.1.2除外&#xff09;。 拖动事件 事件分为两类&#xff0c;当前拖动的元素上的事…

【Makefile】解析Makefile:驾驭自动编译的力量

Makefile简介 一个工程中的源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于进行更复杂的…

你如何理解 JS 的继承?

在JavaScript中&#xff0c;继承是一种机制&#xff0c;允许一个对象&#xff08;子类&#xff09;从另一个对象&#xff08;父类&#xff09;继承属性和方法。这使得子类可以共享父类的功能&#xff0c;并有能∧自身定义新的功能。 JavaScript中的继承通过原型链实现。 具体来…

JavaWeb开发(前端Web开发)

文章目录 前言一、初识Web1.Web开发-介绍2.初识Web前端3.Web标准 二、HTML1.HTML快速入门2.VS Code开发工具3.基础标签&样式4.表格标签5.表单标签 三、JavaScript1.JS-介绍2.JS-引入方式3.JS-基础语法3.1.JS-基础语法-书写语法3.2.JS-基础语法-变量3.2.JS-基础语法-数据类型…

面向Java开发者的ChatGPT提示词工程(7)

在如今信息爆炸的时代&#xff0c;我们面临着海量的文字信息&#xff0c;很难抽出足够的时间去阅读所有感兴趣的内容。然而&#xff0c;大语言模型为我们提供了一种有效的解决方案&#xff1a;通过自动文本摘要&#xff0c;帮助我们快速获取文章的核心内容。这种技术已经被广泛…

vue2 h5开发前进刷新后退缓存实现

vue2 h5开发前进刷新后退缓存实现 在store定义变量 const state {includedComponents: [] }const mutations {includedComponents (state, data) {state.includedComponents data} }在app.vue&#xff08;我这里主要在layout.vue修改&#xff09;使用 keep-alive :include…

使用Microsoft.Office.Interop.PowerPoin遥控PPT

Microsoft.Office.Interop.PowerPoin操作PPT 主窗体&#xff0c;填写ppt路径&#xff0c;打开ppt打开ppt后&#xff0c;可用代码操作ppt可获取每页PPT截图&#xff0c;并获取对应小节名称&#xff0c;备注等代码下载地址联系qq 主窗体&#xff0c;填写ppt路径&#xff0c;打开p…

四.图像处理与光学之3A的 AE

五.图像处理与光学之3A的 AE 3A 是Camera ISP 控制算法的一个重要组成部分,通常分为自动曝光(AE)、自动聚焦(AF)、自动白平衡(AWB)三个组件。 5.0 概述自动曝光(Auto Exposure) 自动曝光算法可以理解为一个伺服系统,它不断监控ISP生成的每一帧图像的曝光状态,如果发现采…

C# Winform小程序:局域网设置NTP服务器、实现时间同步

设置NTP服务器&#xff1a; NTP是网络时间协议(Network Time Protocol)&#xff0c;它是用来同步网络中各个计算机的时间的协议。 局域网不能连接Internet&#xff0c;可以设置一台计算机为NTP服务器。 依次点击&#xff1a;开始---运行---regedit&#xff0c;进入注册表&am…

晶体管放大器结构原理图解

功率放大器的作用是将来自前置放大器的信号放大到足够能推动相应扬声器系统所需的功率。就其功率来说远比前置放大器简单&#xff0c;就其消耗的电功率来说远比前置放大器为大&#xff0c;因为功率放大器的本质就是将交流电能"转化"为音频信号&#xff0c;当然其中不…

JAVA 正则表达式 及 案例

JAVA 正则表达式 及 案例 目录 JAVA 正则表达式 及 案例1.正则表达式Regex1.1 概述1.2 常见语法1.3 String提供了支持正则表达式的方法1.4 练习&#xff1a;测试输入身份证号 1.正则表达式Regex 1.1 概述 正确的字符串格式规则。 常用来判断用户输入的内容是否符合格式的要求…

chatgpt赋能python:为什么在写Python代码时需要注意空格的使用

为什么在写Python代码时需要注意空格的使用 作为一门高效、易读且简单的编程语言&#xff0c;Python在软件开发领域中得到了越来越广泛的应用。然而&#xff0c;在Python的编码过程中&#xff0c;空格的使用可能会带来一些难以预料到的问题。为了避免这些问题&#xff0c;我们…

Redis【实战篇】---- 商户查询缓存

Redis【实战篇】---- 商户查询缓存 1. 什么是缓存&#xff1f;1. 为什么要使用缓存2. 如何使用缓存 2. 添加商户缓存1. 缓存模型和思路2. 代码如下 3. 缓存更新策略1. 数据库缓存不一致解决方案2. 数据库和缓存不一致采用什么方案 4. 实现商铺和缓存与数据库双写一致5. 缓存穿透…

Linux系统编程:详解环境变量

目录 一. 环境变量的基本概念 1.1 什么是环境变量 1.2 环境变量的功能测试 二. 与环境变量相关的操作 三. 环境变量的组织方式 四. 通过代码获取环境变量的值 五. 总结 一. 环境变量的基本概念 1.1 什么是环境变量 环境变量是用于指定操作系统相关参数的、全局的变量。…

大语言模型 -- 部署LaWGPT模型记录

模型介绍&#xff1a; 该系列模型在通用中文基座模型&#xff08;如 Chinese-LLaMA、ChatGLM 等&#xff09;的基础上扩充法律领域专有词表、大规模中文法律语料预训练&#xff0c;增强了大模型在法律领域的基础语义理解能力。在此基础上&#xff0c;构造法律领域对话问答数据…