什么?发票合并还在开会员?不如看看这个小程序【发票合并】【PDF合并】

这篇具有很好参考价值的文章主要介绍了什么?发票合并还在开会员?不如看看这个小程序【发票合并】【PDF合并】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事出原因

最近涉及到电子普通发票报销。就会涉及到上传以及打印发票的问题。

开发票肯定是大于两个PDF。分开打印浪费纸张WPS的PDF合并转换的软件呢又需要会员无奈。小帅丶就依靠自己三脚猫的能耐,用Java(Apche PDFBox)实现了一下PDF合并。

Apache PDFBox 简介 

Apache PDFBox 是一个用于处理和操作 PDF 文件的开源 Java 库,它提供了丰富的功能和工具,用于创建、解析、操作和转换 PDF 文件。下面我们将介绍一下 Apache PDFBox 的优点、缺点以及类似的框架。

优点

  • 强大的功能:Apache PDFBox 提供了丰富的功能和工具,包括创建、解析、操作、转换各种 PDF 文件。它可以用于生成 PDF 文档、提取文本内容、合并和拆分 PDF 文件等各种操作。

  • 良好的文档支持:Apache PDFBox 配备了详尽的文档和示例,使开发人员可以快速上手并充分利用其功能。此外,它拥有一个活跃的开发者社区,用户可以从社区中获取支持和帮助。

  • 跨平台兼容性:作为一个基于 Java 的库,Apache PDFBox 具有极强的跨平台兼容性,可以在各种操作系统和开发环境中使用。

缺点

  • 学习曲线较陡峭:由于PDF文件的复杂性,Apache PDFBox 的使用可能需要一定的学习和实践。特别是对于处理 PDF 文件较为复杂的操作,可能需要一定的时间和精力。

  • 相对较大的库:由于其强大的功能,Apache PDFBox 的库文件相对较大,可能占用一定的存储空间。

类似框架

  • iText:iText是另一个流行的用于处理PDF文件的Java库,提供了类似的功能和工具。与Apache PDFBox相比,iText可能在一些高级特性和商业化支持方面更加成熟。

  • PDFTron:PDFTron是一家专注于PDF技术的公司,提供了丰富的PDF处理解决方案和工具。它的SDK包括了丰富的功能和工具,能够满足各种PDF处理需求。

总的来说,Apache PDFBox 是一个强大而灵活的 Java 库,适用于各种处理和操作 PDF 文件的场景。选择使用 PDF 处理库时,需要结合具体的功能需求、文档支持以及各项性能指标来进行综合考量。

信息来源:百度搜素

大致思路

1.PDF转图片,并进行缩放处理,DPI设定为300                     

2.新建一个空白PDF(是提前创建好的哦~)                             

3.将第一步处理好的2个图片文件添加到空白PDF,设置透明度,缩放宽高比例符合A4大小,另存为PDF文件。                                                             

大功告成!

温馨提示:需要额外字体支持~

https://download.csdn.net/download/u010651369/88671953

上代码

全部代码 全部代码https://gitee.com/xshuai/worktools/blob/master/src/main/java/cn/ydxiaoshuai/pdf/PDFMergerSample.java

/**
     * @Author 小帅丶
     * @Description 普通发票合并成一个PDF
     * @Date  2022年12月27日09:58:59
     * @param pdfParams - PDF数据
     * @param isGray - 是否进行灰度处理图片
     * @param grayType - 灰度类别
     * @return java.io.ByteArrayOutputStream
     **/
    public static ByteArrayOutputStream mergeInvoiceOnePDF(List<PDFParams> pdfParams,
                                                           boolean isGray, Integer grayType) throws Exception {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        if(pdfParams.size()>2){
            throw new Exception("PDF文件个数错误 最多不超过2个");
        }else{
            garyType(grayType);
            //先对PDF进行处理
            List<BufferedImage> allImg = new ArrayList<>();
            long startTime = System.currentTimeMillis();
            for (PDFParams pdfParam : pdfParams) {
                PDFUtils.setFonts(FontFormat.TTF, "STSong-Light", FONT_FILE);
                byte[] bytes = FileUtil.readBytes(pdfParam.getFilePath());
                String pdfBase = Base64Encoder.encode(bytes);
                List<BufferedImage> bufferedImages = PDFUtils.pdfToImage(pdfBase);
                BufferedImage invoiceBI = bufferedImages.get(0);
                if (isGray) {
                    invoiceBI = grayDealImage(invoiceBI, grayType);
                }
                allImg.add(invoiceBI);
            }
            System.out.println("PDF转图片耗时:" + (System.currentTimeMillis() - startTime));
            //开始合并图片到PDF
            if (!allImg.isEmpty()) {
                //合成后的文件
                PdfReader reader = new PdfReader(new FileInputStream(EMPTY_PDF));
                PdfStamper stamper = new PdfStamper(reader, outputStream);
                //将所有图片放在pdf文件的第1页
                PdfContentByte over = stamper.getOverContent(1);
                for (int i = 0; i < allImg.size(); i++) {
                    BufferedImage bufferedImage = allImg.get(i);
                    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                    ImageIO.write(bufferedImage, "jpg", outStream);
                    //图片转com.itextpdf.text.Image
                    com.itextpdf.text.Image contractSealImg = com.itextpdf.text.Image.getInstance(outStream.toByteArray());
                    over.saveState();
                    PdfGState pdfGState = new PdfGState();
                    //给图片设置透明度
                    pdfGState.setFillOpacity(1F);
                    over.setGState(pdfGState);
                    //缩放比例值
                    double scaleX = (double) DEFAULT_IMG_WIDTH / contractSealImg.getWidth();
                    //计算等比缩放的高度
                    float height = (float) (scaleX * contractSealImg.getHeight());
                    //设置图片位置
                    //PDF从底部左下角算为原点坐标
                    if (i == 0) {
                        contractSealImg.setAbsolutePosition(ABSOLUTE_X, ABSOLUTE_Y);
                    } else {
                        contractSealImg.setAbsolutePosition(ABSOLUTE_X, A4_72_HEIGHT - height);
                    }
                    //设置图片大小
                    contractSealImg.scaleAbsolute(DEFAULT_IMG_WIDTH, height);
                    //将图片添加到pdf文件
                    over.addImage(contractSealImg);
                    over.restoreState();
                    outStream.close();
                }
                stamper.setFormFlattening(true);
                stamper.close();
                reader.close();
                outputStream.close();
            }
            System.out.println("合成总耗时:" + (System.currentTimeMillis() - startTime));
            return outputStream;
        }

    }

 如何使用

小帅丶为了方便使用,将此功能实现发布在了微信小程序里面。搜索 小帅一点资讯

功能实现暂无涉及到商用内容,所以此功能呢,目前也是免费使用哦~

​也可以先看下视频操作。再进行体验哦~

温馨提示:理论上2张电子普通发票都可以合并哦​~文章来源地址https://www.toymoban.com/news/detail-821496.html

到了这里,关于什么?发票合并还在开会员?不如看看这个小程序【发票合并】【PDF合并】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 还在纠结报表工具的选型么?来看看这个

    数据信息化的应用与项目中,通常都会遇到报表需求,数量少的,零星需要做的,可能手工就搞定了,数量多的,长期做的,基本都会选用一个报表工具,因为长期做,就必须考虑成本了,找一个称手的工具来降本增效是非常重要的 报表工具有那么多,那就得选型,选起来复

    2024年02月02日
    浏览(47)
  • Flutter页面刷新失败?看看是不是这个原因

    我用flutter开发了一个页面,页面上有一些自己写的控件A,A控件里有一个button,我点击这个A控件里的button的时候,直接在onPressed里调用setState发现页面并没有刷新。 要实现控件A所在页面的整体刷新要怎么实现呢? 在Flutter中,要实现点击控件A中的按钮后刷新整个页面,你可

    2024年02月05日
    浏览(45)
  • 还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

    之前写过一篇文章 我理想中的低代码开发工具的形态,已经吐槽了各种封装 xxxForm,xxxTable 的行为,这里就不啰嗦了。今天再来看看我的工具达到了什么程度。 多图预警。。。 目前我们没有写一行代码,就已经达到了如下的效果 下面是一部分生成的代码 这就是用模板生成的

    2024年02月02日
    浏览(42)
  • 多个PDF发票合并实现一张A4纸打印2张电子/数电发票功能

    python教程79--A4纸增值税电子发票合并打印_python 打印 发票设置_颐街的博客-CSDN博客 文章浏览阅读7.9k次。接上篇https://blog.csdn.net/itmsn/article/details/121902974?spm=1001.2014.3001.5501一张A4纸上下2张增值税电子发票实现办法。使用环境:python3.8、mac、docx库开发工具:jupyterlab增值税电子发

    2024年02月05日
    浏览(73)
  • javaer你还在手写分表分库?来看看这个框架怎么做的 干货满满

    高并发三驾马车:分库分表、MQ、缓存。今天给大家带来的就是分库分表的干货解决方案,哪怕你不用我的框架也可以从中听到不一样的结局方案和实现。 一款支持自动分表分库的orm框架 easy-query 帮助您解脱跨库带来的复杂业务代码,并且提供多种结局方案和自定义路由来实现比

    2024年02月06日
    浏览(47)
  • 还在被机组组合问题困扰?快来试试这个用处极大的考虑安全约束机组组合模型!

    前言 所谓安全约束机组组合,即在满足电力系统安全性约束的条件下,以系统购电成本最低等为优化目标,制定多时段的机组开停机计划。 机组组合(Unit commitment, Uc)优化问题旨在电力系统运行时,安全给定以及调整发电机组的启/停与实时出力,使发电机组的总运行成本最小

    2024年03月27日
    浏览(52)
  • Java Jar 包还不知道怎么反编译,赶紧看看这个 IDEA 插件!

    当我们使用 Java 开发时,经常会遇到一种情况:我们拿到了一个 JAR 文件,但是却没有源代码。这时候,我们就需要使用反编译工具来帮助我们还原出源代码。 反编译工具可以将编译后的 JAR 文件转换回可读的 Java 源代码。这样,我们就可以看到原始的代码,理解它的逻辑和

    2024年02月04日
    浏览(49)
  • 无需付费开会员,一个Python程序实现PDF转高清图片

    今天需要将一个PDF导出为图片,但是一般的在线转换网站导出的图片清晰度都不高,分辨率只有1241*1754,这就导致输出的图片放大后字体是有点模糊的,所以就想到了使用Python中的 PyPDF2 库来处理PDF文件,以及 Pillow 库来处理图像 首先,确保你已安装所需的库。你可以使用以

    2024年02月07日
    浏览(53)
  • 今年最火的拼团玩法,全民拼购模式,这个点子你可以看看

    什么是全民拼购? “全民拼购”是将“社交电商”与“拼购玩法”结合起来的一种全新的营销模式,它通过更人性化的方式,将商品的销售利益最大化,既能激励消费者参与,又能促进商品的销售,实现“多方共赢”。 全民拼购是“社交电商”和“拼购玩法”结合的商业模

    2024年02月14日
    浏览(36)
  • 数据安全之数据库字段加解密检索和前端返回脱敏?看看我这个最强解决方案

    数据安全一直是我们老生常谈的话题了,随着国产化的日渐推进和数字化信息改革,数据安全越来越被人们所重视。数据库作为存储、管理和检索数据的核心基础设施,其中可能包含着大量的敏感信息,如个人手机号、身份证号码、银行账户、家庭地址等信息。为了保障这些敏

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包