加载中...

vue3使用jsPDF实现上传图片转pdf(可多图转多页pdf)

vue3使用jsPDF实现上传图片转pdf(可多图转多页pdf)

一、安装jsPDF

npm install jspdf

二、引入并使用,以下为完整示例代码

  1. <template>
  2. <div>
  3. <span class="header_text">上传图片转pdf</span>
  4. <input
  5. type="file"
  6. @change="pdfUpload($event)"
  7. multiple
  8. accept="image/jpeg,image/jpg,image/png"
  9. />
  10. </div>
  11. </template>
  12. <script lang="ts" setup>
  13. import { jsPDF } from "jspdf";
  14. import { ref } from "vue";
  15. const pdfList: any = ref([]);
  16. //获取图片宽高
  17. const getImgWidthHeight = (src: any) => {
  18. return new Promise((resolve, reject) => {
  19. const img = new Image();
  20. img.src = src;
  21. // 图片是否有缓存 如果有缓存可以直接拿 如果没有缓存 需要从onload拿
  22. if (img.complete) {
  23. const { width, height } = img;
  24. resolve({
  25. width,
  26. height,
  27. });
  28. } else {
  29. img.onload = function () {
  30. const { width, height } = img;
  31. resolve({
  32. width,
  33. height,
  34. });
  35. };
  36. }
  37. });
  38. };
  39. const pdfUpload = async (ev: any) => {
  40. let imgList = ev.target.files;
  41. const pdf = new jsPDF("p", "mm", "a4");
  42. for (let i = 0; i < imgList.length; i++) {
  43. // 仅限图片可操作
  44. if (["image/jpeg", "image/png"].includes(imgList[i].type)) {
  45. let url = URL.createObjectURL(imgList[i]);
  46. const { width, height } = await getImgWidthHeight(url);
  47. // A4页面宽高
  48. // const max = { width: 210, height: 300 };
  49. // 如果宽度>高度,宽度设置为160,高度缩放,反之则高度设置200,宽度缩放
  50. let finalWidth = 0;
  51. let finalHeight = 0;
  52. if (width > height) {
  53. finalWidth = 160;
  54. finalHeight = (160 / width) * height;
  55. } else {
  56. finalHeight = 200;
  57. finalWidth = (200 / height) * width;
  58. }
  59. // 在pdf中添加图片
  60. pdf.addImage(url, "png", 1, 1, finalWidth, finalHeight);
  61. // 有多个图片则添加多个pdf页面
  62. if (i !== imgList.length - 1) {
  63. pdf.addPage();
  64. }
  65. }
  66. }
  67. let blob = new Blob([pdf.output("blob")], { type: "application/pdf" });
  68. // pdf.output("datauristring")会导出base64
  69. // let pdfBase64 = pdf.output("datauristring");
  70. //文件名自定义,可以拼接时间戳保证唯一性
  71. let name = "pdfFile";
  72. // 生成file文件
  73. let file = new File([blob], `${name}.pdf`, { type: blob.type });
  74. // 将文件push到文件list中待用
  75. pdfList.value.push(file);
  76. };
  77. </script>
  78. <style lang="scss" scoped>
  79. </style>

三、实现效果

New Image

四、写在最后

实现图片转pdf主要还是在于对jsPDF中addImage()addPage()以及output()方法的使用,当然jsPDF的功能不止于此,想了解更多可以点击链接进入官网(https://github.com/parallax/jsPDF

如果觉得以上内容对你有所帮助的话,就帮博主点赞收藏吧~~