Java使用itext5实现生成多个PDF并合并

2025-05-14 08:20:50 156
魁首哥

pdf批量生成并合并为1个pdf

单个生成

    /**
     * 根据id查询数据
     * @param id 数据id
     * @return
     */
    private map queryentitydatabyid(string id) {
        //根据id查询
        box entity = boxservice.getbyid(id);

        map data = new hashmap();
        //显示内容
        //id
        data.put("id", entity.getjdkh());
        //动态生成当前时间的yymmddhh格式
        datetimeformatter formatter = datetimeformatter.ofpattern("yymmddhh");
        string currentdate = localdatetime.now().format(formatter);
        data.put("date", currentdate);

        //二维码内容
        data.put("imsi", entity.getimsi());
        data.put("imei", entity.getimei());

        string type = entity.gettype();
        if (type == null || type.isempty()) {
            type = "a";
        }
        data.put("type", type);
        return data;
    }

    //根据数据生成pdf
    private void generatepdffordata(map data, bytearrayoutputstream outputstream) throws exception {
        // load the pdf template
        inputstream templatestream = getclass().getresourceasstream("/template/ddentitytemplate.pdf");
        pdfreader reader = new pdfreader(templatestream);
        pdfstamper stamper = new pdfstamper(reader, outputstream);

        acrofields form = stamper.getacrofields();
        string fontpath = file.separator + "font" + file.separator + "micosoftyh.ttf";
        basefont bfchinese = basefont.createfont(fontpath, basefont.identity_h, basefont.embedded);
        map fields = form.getfields();
        for (string k : fields.keyset()) {
            form.setfieldproperty(k, "textfont", bfchinese, null);
            form.setfieldproperty(k, "textsize", float.valueof("55"), null);
            form.setfieldproperty(k, "textstyle", com.itextpdf.text.font.bold, null);
            form.setfieldproperty(k, "textalign", element.align_middle, null);
        }
        //特殊文本框字体大小重置
        form.setfieldproperty("$serialnumber$", "textsize", float.valueof("40"), null);
        //标签内容
        //id
        form.setfield("$id$", data.get("id"));
        //日期
        form.setfield("$date$", data.get("date"));

        //二维码
        string qrcontent = string.format(
                        "id:%s\n" +
                        "imsi:%s\n" +
                        "imei:%s\n" +
                        "type:%s",
                data.get("id"), data.get("imsi"), data.get("imei"),data.get("type"));
        pdfcontentbyte cb = stamper.getovercontent(1);
        generateqrcode(qrcontent, cb);
        stamper.setformflattening(true);
        stamper.close();
        reader.close();
    }

返回pdf

    /**
     * 根据id批量生成pdf并合并
     * @param ids ids集合
     * @return 可直接访问的pdf流文件
     */
    @getmapping("/generatemergepdfstream")
    public responseentity generatemergepdfstream(@requestparam string ids) {
        long starttime = system.currenttimemillis();
        system.out.println("开始生成pdf: " + starttime);
        try {
            string[] idarray = ids.split(",");
            bytearrayoutputstream mergedoutputstream = new bytearrayoutputstream();
            document mergeddocument = new document();
            pdfsmartcopy copy = new pdfsmartcopy(mergeddocument, mergedoutputstream);
            mergeddocument.open();

            for (string id : idarray) {
                map data = queryentitydatabyid(id.trim());

                bytearrayoutputstream pdfoutputstream = new bytearrayoutputstream();
                generatepdffordata(data, pdfoutputstream);

                system.out.println("生成的pdf文件大小: " + pdfoutputstream.size());

                pdfreader reader = new pdfreader(new bytearrayinputstream(pdfoutputstream.tobytearray()));
                copy.adddocument(reader);
                reader.close();
                pdfoutputstream.close();
            }

            mergeddocument.close();

            bytearrayresource resource = new bytearrayresource(mergedoutputstream.tobytearray());

            httpheaders headers = new httpheaders();
            headers.add("content-disposition", "inline; filename=merged.pdf");

            long generationend = system.currenttimemillis();
            system.out.println("pdf生成与合并完成,总耗时: " + (generationend - starttime) + " 毫秒");

            return responseentity.ok()
                    .headers(headers)
                    .contenttype(mediatype.application_pdf)
                    .body(resource);

        } catch (exception e) {
            e.printstacktrace();
            return responseentity.status(500).build();
        }
    }

文件保存在本地通过http接口访问pdf文件

application.properties

#访问jar包位置的同级files文件,可以直接通过http://ip:port/files下的文件名访问
spring.web.resources.static-locations=file:./files/

合并pdf并保存

    /**
     * 生成合并的pdf文件保存到服务器下面
     * application.properties下面需要配置spring.web.resources.static-locations=file:./files/
     * jar包运行的文件夹目录
     * @param ids ids集合
     * @return 可直接访问的http://ip:port/*.pdf
     */
    @getmapping("/generateentitylogpdf")
    public responseentity generatemergesavepdf(@requestparam string ids, httpservletrequest request) {
        try {
            // 分割ids
            string[] idarray = ids.split(",");

            // 输出流
            bytearrayoutputstream mergedoutputstream = new bytearrayoutputstream();
            document mergeddocument = new document();
            pdfcopy copy = new pdfcopy(mergeddocument, mergedoutputstream);
            mergeddocument.open();

            for (string id : idarray) {
                //根据id查询pdf所需要数据
                map data = queryentitydatabyid(id.trim());

                // 根据id生成pdf数据流
                bytearrayoutputstream pdfoutputstream = new bytearrayoutputstream();
                generatepdffordata(data, pdfoutputstream);

                // 将生成的pdf数据流
                pdfreader reader = new pdfreader(new bytearrayinputstream(pdfoutputstream.tobytearray()));
                copy.adddocument(reader);
                reader.close();
            }

            mergeddocument.close();

            //保存文件路径
            string currentdatedir = localdate.now().format(datetimeformatter.ofpattern("yyyymmdd"));
            // 获取运行目录下的 files 目录路径
            string filepath = system.getproperty("user.dir") + file.separator + "files" + file.separator + currentdatedir;
            file directory = new file(filepath);

            // 检查目录是否存在,不存在则创建
            if (!directory.exists()) {
                directory.mkdirs();
            }

            // 保存文件名
            random random = new random();
            int randomnumber = random.nextint(1000);
            string filename = system.currenttimemillis() + "_" + randomnumber + ".pdf";

            file file = new file(directory, filename);
            try (fileoutputstream fos = new fileoutputstream(file)) {
                fos.write(mergedoutputstream.tobytearray());
                fos.flush();
                system.out.println("文件保存成功:" + file.getabsolutepath());
            } catch (ioexception e) {
                e.printstacktrace();
            }
            //返回直接访问pdf的url
            string ip = request.getservername();
            int port = request.getserverport();
            string fileurl = "http://" + ip + ":" + port + "/" + currentdatedir + "/" + filename;
            return responseentity.ok(fileurl);
        } catch (exception e) {
            e.printstacktrace();
            return responseentity.status(500).build();
        }
    }

出现问题pdf文件过大

解决办法:

提取字体子集

到此这篇关于java使用itext5实现生成多个pdf并合并的文章就介绍到这了,更多相关java itext5生成pdf内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

分享
海报
156
上一篇:Java实现ThreadLocalMap 扩容机制 下一篇:设置Log4j2监控间隔的三种方法

忘记密码?

图形验证码