获取到当前页面多个图片的url后,如何实现将这些图片转成一个pdf文件并下载呢?
只要前端,不要后端
在前端 vue 中实现根据图片 URL 生成 PDF 文件的基本流程如下:
安装并引入 PDF 生成库,例如 jspdf。
定义一个函数,用于生成 PDF 文件。
利用 JavaScript 的 Canvas API,将图片 URL 转换为图片数据。
利用 PDF 生成库,在 PDF 文件中添加图片数据。
利用 JavaScript 的 Blob API 或者 saveAs 库,将 PDF 文件保存到本地并下载。
下面是一个实现根据图片 URL 生成 PDF 文件并下载的代码示例:
// 1. 安装并引入 jspdf
import JsPDF from 'jspdf'
// 2. 定义生成 PDF 文件的函数
function generatePDF(imgUrls) {
// 3. 利用 Canvas API 转换图片 URL 为图片数据
const promises = imgUrls.map(url => {
return new Promise(resolve => {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
const img = new Image()
img.onload = function() {
canvas.width = img.width
canvas.height = img.height
ctx.drawImage(img, 0, 0)
resolve(canvas.toDataURL('image/png'))
}
img.src = url
})
})
// 4. 生成 PDF 文件
Promise.all(promises).then(images => {
const pdf = new JsPDF()
images.forEach((image, i) => {
pdf.addImage(image, 'PNG', 0, 0)
if (i !== images.length - 1) {
pdf.addPage()
}
})
// 5. 下载 PDF 文件
pdf.save('images.pdf')
})
}
也可以将url连接提交到后台,在后台使用itext来生成对应的pdf文件,再生成响应流返回给前端组件。
这个pdf要看是前端合成还是后端
前端:可以借助pdf相关的js合成插件直接导出,取决于客户端性能可能会慢一点,不需要消耗服务器资源
后端:需要上传到服务器进行合成,速度快点 但是会需要从服务器二次下载合成好的pdf文件 会消耗服务器资源
可以使用 jsPDF 库实现:
1.安装jsPDF:npm install jspdf
2.引入jsPDF:import jsPDF from 'jspdf'
3.编写代码:
let pdf = new jsPDF();
let images = [url1, url2, ...];
images.forEach((image, index) => {
let canvas = document.createElement('canvas');
let context = canvas.getContext('2d');
let img = new Image();
img.src = image;
img.onload = () => {
canvas.width = img.width;
canvas.height = img.height;
context.drawImage(img, 0, 0, img.width, img.height);
let imgData = canvas.toDataURL("image/jpeg", 1.0);
pdf.addImage(imgData, 'JPEG', 0, 0);
if (index < images.length - 1) {
pdf.addPage();
} else {
pdf.save("images.pdf");
}
};
});
推荐使用后端服务生成,前端调用就行了,非常简单,可以参考完整的案例
安装一个 jspdf 插件就可以了
想前端做就用jspdf之类的库,后端做的话直接调用
你好,可以参考下面这篇文章
https://www.cnblogs.com/architectforest/p/16488814.html
两种方式可以处理:
1.使用html2canvas
首先,需要引入html2canvas.min.js文件
<script src="https://unpkg.com/html2canvas@latest/dist/html2canvas.min.js"></script>
2.获取图片资源
在Vue项目中,可以使用axios获取图片资源:
this.$axios.get(url, {
responseType: 'blob'
})
.then(res => {
const imgBlob = res.data
this.getImgUrl(imgBlob)
})
.catch(() => {
console.log('图片获取失败')
})
3.将图片转换为base64格式
getImgUrl(blob) {
const reader = new FileReader()
reader.onload = e => {
const imgUrl = e.target.result
this.urlToImg(imgUrl)
}
reader.readAsDataURL(blob)
},
4.将图片转换为canvas
urlToImg(url) {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
const img = new Image()
img.crossOrigin = ''
img.src = url
img.onload = () => {
canvas.height = img.height
canvas.width = img.width
ctx.drawImage(img, 0, 0)
this.makePdf(canvas)
}
},
5.使用html2canvas将canvas转换为pdf
makePdf(canvas) {
html2canvas(canvas, {
allowTaint: true,
useCORS: true
}).then(canvas => {
let contentWidth = canvas.width
let contentHeight = canvas.height
//一页pdf显示html页面生成的canvas高度;
let pageHeight = contentWidth / 592.28 * 841.89
//未生成pdf的html页面高度
let leftHeight = contentHeight
//页面偏移
let position = 0
//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
let imgWidth = 595.28
let imgHeight = 592.28/contentWidth * contentHeight
let pageData = canvas.toDataURL('image/jpeg', 1.0)
let pdf = new jsPDF('', 'pt', 'a4')
//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
//当内容未超过pdf一页显示的范围,无需分页
if (leftHeight < pageHeight) {
pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
} else {
while (leftHeight > 0) {
pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
leftHeight -= pageHeight
position -= 841.89
//避免添加空白页
if (leftHeight > 0) {
pdf.addPage()
}
}
}
pdf.save('content.pdf')
}
},
不知道你这个问题是否已经解决, 如果还没有解决的话:使用iframe、embed、object等窗口直接预览。然后调节下样式就行了…
然后直接就能预览了。貌似很香。貌似。。。。
然后你就会发现。当你的应用是移动app的时候。iframe窗体会自动跳转到pdf的网址。
当你一顿百度设置iframe的某个属性的时候。你会发现并不能解决。。。
像这样:
npm install jspdf
import jsPDF from 'jspdf'
3.获取图片URL:在Vue组件中,使用以下代码获取图片URL:
let urls = [...]; // 图片URL数组
4.
<template>
<div>
<button @click="generatePdf">生成PDF</button>
</div>
</template>
<script>
import jsPDF from 'jspdf'
export default {
methods: {
generatePdf() {
let urls = ['图片1的URL', '图片2的URL', '图片3的URL'];
let pdf = new jsPDF();
for (let i = 0; i < urls.length; i++) {
let img = new Image();
img.src = urls[i];
pdf.addImage(img, 'PNG', 0, 0, 210, 297);
if (i < urls.length - 1) {
pdf.addPage();
}
}
pdf.save('file.pdf');
}
}
}
</script>
给你个思路,前端可以用 jspdf 插件来实现,具体如何引入并使用非常简单,不难。