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

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

使用到的工具:

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

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

 $ npm install pdf-poppler

代码:

<script>
  export default {
    data() {
      return {
        tableNowSelectionData:[],//el-table多选选中的数据
        allPrintData:[],//点击print时深拷贝el-table多选选中的数据
        testData:[],//用于保存返回后的pdf流
      }
    },
    watch:{
      testData(newVal, oldVal) {
        if (newVal.length == this.allPrintData.length) {
          //利用侦听器,如果testData的数据长度等于allPrintData的长度,说明所有的pdf流文件都拿到了,将他们传入batchPrintPDF函数
          this.batchPrintPDF(newVal);
        }
      },
    },
    methods:{
      print(){
        this.testData = [];//清空保存的pdf流
        this.allPrintData = JSON.parse(
          JSON.stringify(this.tableNowSelectionData)
        );//点击print时深拷贝el-table多选选中的数据
        for (let item of this.tableNowSelectionData) {//循环选中的数据发送请求
          let obj = {
            id:item.id,
          };//obj为根据需求需要传给后端的数据
          axios({//这是使用原生axios是因为使用封装后的axios拿到的pdf会莫名变成空白,但是原生axios就不会有这个问题
            url: downloadUrl,//请求地址,如果跨域需要做反向代理配置
            method: "post",
            data: obj,
            responseType: "arraybuffer",
          })
            .then(async (res) => {
              console.log(res);//返回的数据如下图,res.data才是我们需要的数据
              this.testData.push(res.data);//将返回的pdf流push进testData
            })
            .catch((err) => {
              this.$message.error("打印失败", err);
            });
        }
      },
      batchPrintPDF(pdfList) {
        let arr = [];
        pdfList.map((item, index) => {
          const binaryData = [];
          binaryData.push(item);
          let url = window.URL.createObjectURL(
            new Blob(binaryData, {
              type: "application/pdf"
            })
          );
          arr.push(url); //将pdf流文件转为blob并存入数组
        });
        const PDFMerger = require("pdf-merger-js"); //引入合并pdf插件
        let merger = new PDFMerger();
        let pdfUrl = "";
        arr.map(async (item, index) => {
          await merger.add(item); //添加需要合并的pdf地址
          if (index == arr.length - 1) {
            //最后一个pdf地址添加完成后向下执行
            const binaryData = [];
            let str = await merger.saveAsBuffer(); //拿到合并后的二进制文件
            binaryData.push(str.buffer);//转buffer格式
            pdfUrl = await window.URL.createObjectURL(
              new Blob(binaryData, {
                type: "application/pdf"
              })
            );//将buffer格式转为blob格式
            let printData = await [pdfUrl];
            printJS({
              printable: printData,
              type: "pdf",
            }); //调用浏览器打印
          }
        });
      }
    },
  }
</script>

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

 

要使用 Poppler打印 PDF 文件,需要按照以下步骤: 1. 安装 Poppler 库。可以通过包管理器来安装,例如在 Ubuntu 上可以使用以下命令: ``` sudo apt-get install libpoppler-dev ``` 2. 编写 C++ 代码。下面是一个简单的示例代码,演示如何使用 Poppler打印 PDF 文件: ```c++ #include <poppler/cpp/poppler-document.h> #include <poppler/cpp/poppler-page.h> #include <poppler/cpp/poppler-page-renderer.h> #include <iostream> int main(int argc, char* argv[]) { // 打开 PDF 文件 auto doc = Poppler::Document::load_from_file(argv[1]); if (!doc) { std::cerr << "Failed to open PDF file" << std::endl; return 1; } // 获取第一页并设置输出分辨率 auto page = doc->create_page(0); auto renderer = Poppler::PageRenderer(); renderer.set_render_hint(Poppler::PageRenderer::TextAntialiasing); // 渲染并输出 renderer.render_page_to_file(&page, "output.png", 300, 300); return 0; } ``` 在上面的代码中,我们首先打开 PDF 文件并获取第一页。然后,我们创建一个 `Poppler::PageRenderer` 对象,并将输出分辨率设置为 300 dpi。最后,我们使用 `render_page_to_file` 函数将页面渲染为 PNG 文件。 3. 编译并运行代码。使用以下命令编译代码: ``` g++ -o print_pdf print_pdf.cpp `pkg-config --cflags --libs poppler-cpp` ``` 在上面的命令中,我们使用 `pkg-config` 工具来获取 Poppler 库的编译选项。然后,我们将生成的可执行文件运行: ``` ./print_pdf input.pdf ``` 在上面的命令中,我们将输入的 PDF 文件作为命令行参数传递给程序。程序将在当前目录下生成一个名为 `output.png` 的 PNG 文件,其中包含第一页的渲染结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值