发票PDF在线合并小工具

发票PDF在线合并小工具

月光魔力鸭

2020-12-24 00:28 阅读 1685 喜欢 4 发票合并 PDF合并 在线合并PDF

在公司报销的时候虽然已经有了电子发票,但是贴票还是需要将发票打印出来贴上,如果只有一两张也就算了,如果几十张.. 呵呵,光胶水我都不够用的,找了好多工具、在线版本都不合心意,烦死,自己做个自己喜欢的吧。 二次更新 : 发票PDF在线合并来啦 查了下lib库,看了下API 开干。

准备

文档准备

本来想着,将pdf读成图片然后缩放在一个PDF中,结果发现pdf-lib直接就可以将pdf进行缩放,到时省事了。

pdf-lib github地址: https://github.com/Hopding/pdf-lib

代码

这里用到的API很少,主要有以下几个:

embedPdf  :  嵌入PDF文档 
scale           :  将PDF进行缩放    
addPage    :  添加一个新的pdf页面
drawPage  : 将PDF写入新pdf页面

完整代码:

/**
 * 年底,将12个月份的发票合并在一个pdf中。
 * ps.在线的各种不中意,线下的各种收费加水印。
 * npm i pdf-lib
 */
const pdfLib = require('pdf-lib')
const PDFDocument = pdfLib.PDFDocument
// import { PDFDocument } from 'pdf-lib'
const fs = require('fs')
const path = require('path')
//这里需要修改为自己的路径
const folderPath = `I:\\huafei\\huafei\\2020pdf`
  ; (async function () {
    // Create a new PDFDocument
    const pdfDoc = await PDFDocument.create()
    // Add a blank page to the document
    let page = pdfDoc.addPage()

    let lineNum = 1 //每行几张发票

    let fileList = fs.readdirSync(folderPath)
    let i = 0
    fileList.sort((a, b) => {
      let aa = path.basename(a)
      let bb = path.basename(b)
      return aa - bb
    })
    for (let file of fileList) {
      let filePath = path.join(folderPath, file)
      let fileStream = fs.readFileSync(filePath)
      const [americanFlag] = await pdfDoc.embedPdf(fileStream)
      const dims = americanFlag.scale(1 / lineNum)
      // Draw the JPG image in the center of the page
      let opts = {
        ...dims,
        x: (i % lineNum) * (dims.width - 20) - 5,
        y:
          page.getHeight() -
          Math.floor(i / lineNum) * (dims.height + 5) -
          dims.height,
      }
      //如果当前高度不足,则创建新页面
      console.log(opts)
      if (opts.y < 0) {
        //换页面
        page = pdfDoc.addPage()
        i = 0
        opts = {
          ...dims,
          x: (i % lineNum) * (dims.width - 20) - 5,
          y:
            page.getHeight() -
            Math.floor(i / lineNum) * (dims.height + 5) -
            dims.height,
        }
      }
      page.drawPage(americanFlag, opts)
      i++
    }
    // Serialize the PDFDocument to bytes (a Uint8Array)
    const pdfBytes = await pdfDoc.save()
    fs.writeFileSync(path.join(folderPath, 'total.pdf'), pdfBytes)
  })()

以上,核心代码在github都有,直接拿过来稍微改动即可。 接下来,准备将这个小工具做成web服务,扔到我的小工具中...

转载请注明出处: https://chrunlee.cn/article/pdf-collapse-tool.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
在平时nodejs练习过程中,可能会安装多个不同版本的nodejs,那么我们如何来轻松的管理和切换呢?推荐你一个nvm来试试水
在开发项目过程中,经常需要将开发的项目部署到服务器上,但是每个环境都有每个环境的配置等等,如果每次打包的时候都要去调整(可能删除、替换等),那就很烦人了,这里分享下自己实现的几个简单的小工具(当然这个工具可能只对我自己有用),希望能够帮到你。
前几天给朋友帮忙,想要一个一模一样的网站...自告奋勇去帮忙.. 结果发现之前一直没处理过类似的情况,虽然也写过爬虫,不过看了下网站,也不算麻烦。于是简单实现了这个自动抓站的功能,最终整理成为一个自动抓站的工具,能省很多的事情。
当我们做爬虫或其他的一些应用的时候,如果需要一些短信验证,但是又没有那么多手机号,又不能放人在那里一直输入的时候?怎么办?
在使用puppeteer 跳转窗口的时候,发现waitForNavigator 并不起作用,最后找到通过browser 获得page 并继续操作。
最近有客户提出了这么一个需求:微信dat文件在解码后的图片无法按照时间进行排序。 是的,解码后的文件的时间都是解码的时间,由于软件比较多,当时没做自动更新,所以在这里做一个小工具,可以将对应的解码后的图片的时间修改为微信dat文件对应的时间
最近由于系统需要一些数据进行测试,但是正常的流程都是下载pdf ,打印pdf,然后通过涂写答题卡,将涂写的扫描上传..太麻烦了,想做成简单点,通过程序直接生成..卡在了pdf转图片上,今天抽空找了下库,通过gm可以将pdf转为图片,起码第一步已经实现了,后边的涂学号之前已经做过了。
对于开发来说,看到别人家的小程序都这么靓,这么顺畅,这么好用,用户又多... 自然是眼馋的..用户馋不来,可以先馋他的身子..啊不,代码啊。