加载中...

利用pdf-poppler和printJS完成pdf批量打印

利用pdf-poppler和printJS完成pdf批量打印

前段时间遇到了这么个需求,需要根据后端返回的多个pdf流(如下图),整合成一个pdf文件并打印,在这里分享一下我使用的方法

New Image

使用到的工具:

pdf.js:教程站内有,可以查看一下,

pdf-poppler:使用以下代码下载依赖

 $ npm install pdf-poppler

代码:

  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. tableNowSelectionData:[],//el-table多选选中的数据
  6. allPrintData:[],//点击print时深拷贝el-table多选选中的数据
  7. testData:[],//用于保存返回后的pdf流
  8. }
  9. },
  10. watch:{
  11. testData(newVal, oldVal) {
  12. if (newVal.length == this.allPrintData.length) {
  13. //利用侦听器,如果testData的数据长度等于allPrintData的长度,说明所有的pdf流文件都拿到了,将他们传入batchPrintPDF函数
  14. this.batchPrintPDF(newVal);
  15. }
  16. },
  17. },
  18. methods:{
  19. print(){
  20. this.testData = [];//清空保存的pdf流
  21. this.allPrintData = JSON.parse(
  22. JSON.stringify(this.tableNowSelectionData)
  23. );//点击print时深拷贝el-table多选选中的数据
  24. for (let item of this.tableNowSelectionData) {//循环选中的数据发送请求
  25. let obj = {
  26. id:item.id,
  27. };//obj为根据需求需要传给后端的数据
  28. axios({//这是使用原生axios是因为使用封装后的axios拿到的pdf会莫名变成空白,但是原生axios就不会有这个问题
  29. url: downloadUrl,//请求地址,如果跨域需要做反向代理配置
  30. method: "post",
  31. data: obj,
  32. responseType: "arraybuffer",
  33. })
  34. .then(async (res) => {
  35. console.log(res);//返回的数据如下图,res.data才是我们需要的数据
  36. this.testData.push(res.data);//将返回的pdf流push进testData
  37. })
  38. .catch((err) => {
  39. this.$message.error("打印失败", err);
  40. });
  41. }
  42. },
  43. batchPrintPDF(pdfList) {
  44. let arr = [];
  45. pdfList.map((item, index) => {
  46. const binaryData = [];
  47. binaryData.push(item);
  48. let url = window.URL.createObjectURL(
  49. new Blob(binaryData, {
  50. type: "application/pdf"
  51. })
  52. );
  53. arr.push(url); //将pdf流文件转为blob并存入数组
  54. });
  55. const PDFMerger = require("pdf-merger-js"); //引入合并pdf插件
  56. let merger = new PDFMerger();
  57. let pdfUrl = "";
  58. arr.map(async (item, index) => {
  59. await merger.add(item); //添加需要合并的pdf地址
  60. if (index == arr.length - 1) {
  61. //最后一个pdf地址添加完成后向下执行
  62. const binaryData = [];
  63. let str = await merger.saveAsBuffer(); //拿到合并后的二进制文件
  64. binaryData.push(str.buffer);//转buffer格式
  65. pdfUrl = await window.URL.createObjectURL(
  66. new Blob(binaryData, {
  67. type: "application/pdf"
  68. })
  69. );//将buffer格式转为blob格式
  70. let printData = await [pdfUrl];
  71. printJS({
  72. printable: printData,
  73. type: "pdf",
  74. }); //调用浏览器打印
  75. }
  76. });
  77. }
  78. },
  79. }
  80. </script>

New Image

(此图为上方print函数发送请求返回的数据例字,data为需要使用的数据)