Java按照固定pdf模板生成pdf文件——itext

第一步:生成pdf模板

       先用word写好固定格式的文档,再利用wps将文档转成pdf文件,然后利用Adobe Acrobat DC(此工具是收费的,可以百度搜索进行破解)进行表单域编辑(如下图),编辑成自己想要的模板文件。

Java按照固定pdf模板生成pdf文件——itext_第1张图片

第二步:新建项目

在开发者工具中新建项目,导入jar包或写入maven依赖配置,我在这里用的itext的jar,但itext是收费的,所以也是破解版的,我没有用到maven构建项目,所以我直接导入了这个三个jar包(itextpdf-5.5.5.jar、itext-asian-5.2.0.jar、fontbox-2.0.12.jar)

fontbox-2.0.12.jar (官网下载的fontbox-2.0.12.jar没有中文字体,修改过后的jar包)下载链接https://download.csdn.net/download/javabigadog/10932972

第三步:根据开发需求编写demo

       我完成的demo可以添加文本域和图片域、还可以给pdf文件添加水印

/**

*map为表单域所对应的数据,若是图片,则为图片本地路径

/

public  String createPDF(Map map) {

      //模板所处位置
        String templatePdfUrl ="C:\\temp\\Template.pdf";
        String pdfUrl = "C:\\temp\\test.pdf";
        PdfReader reader = null;
        AcroFields af = null;
        PdfStamper ps = null;
        ByteArrayOutputStream bos = null;
        FileOutputStream fos = null;    
        //加入pdf内容
        try {
            reader = new PdfReader(templatePdfUrl);
            bos = new ByteArrayOutputStream();
            ps = new PdfStamper(reader,bos);
            af = ps.getAcroFields();            
            //使用中文字体
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);            
            af.addSubstitutionFont(bfChinese);
            System.out.println("size:"+map.size());

            //给表单文本域赋值
            Set> set = map.entrySet();
            Iterator> it = set.iterator();
            Entry entry = null;
            while (it.hasNext()) {
                entry = it.next();
                if(entry.getValue()!=null) {
                    System.out.println("key:"+entry.getKey()+" "+entry.getValue());
                    af.setField(entry.getKey(), entry.getValue());
                }
            }
            //设置不能编辑
            ps.setFormFlattening(true);
            //添加图片
            String imgpath=map.get("IMGURL");
            File imgFile = new File( imgpath);
            if(imgFile.exists()) {
                int pageNo1 = af.getFieldPositions("DZYZ_af_image").get(0).page;
                Rectangle signRect1 = af.getFieldPositions("DZYZ_af_image").get(0).position;
                float x1 = signRect1.getLeft();
                float y1 = signRect1.getBottom();
                Image image1 = Image.getInstance( imgpath);
                PdfContentByte under1 = ps.getOverContent(pageNo1);
                image1.scaleToFit(signRect1.getWidth(),signRect1.getHeight());
                image1.setAbsolutePosition(x1,y1);
                under1.addImage(image1);
            }       
            //添加水印
            String waterMarkName=map.get("waterMarkName");
            PdfContentByte under;
            Rectangle wmRect =ps.getReader().getPageSizeWithRotation(1);
            under = ps.getOverContent(1);
            under.saveState();
            // set Transparency
            PdfGState gs = new PdfGState();
            // 设置透明度为0.2
            gs.setFillOpacity(0.2f);
            under.setGState(gs);
            under.restoreState();
            under.beginText();

           //设置字体和字体大小
            under.setFontAndSize(bfChinese, 18);
            under.setTextMatrix(30, 30);
            under.setColorFill(new BaseColor(179,185,181));
            for (int y = 0; y < 10; y++) {
                for (int x = 0; x < 8; x++) {
                    // 水印文字成35度角倾斜
                    under.showTextAligned(Element.ALIGN_LEFT
                            , waterMarkName, 5+ 260* x, 260*y, 35);    
            }
            under.endText();
            under.setLineWidth(1f);
            under.stroke();     
            ps.close();
            reader.close();
            fos = new FileOutputStream(pdfUrl);
            fos.write(bos.toByteArray());
            fos.flush();
        } catch (IOException|DocumentException e) {
            e.printStackTrace();
        }finally{
            try {
                if(fos!=null) {
                    fos.close();                    
                }
                if(bos!=null) {
                    bos.close();                    
                }
                if(reader!=null) {
                    reader.close();                    
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }        
        return pdfUrl;
    }

▄█▀█●老铁,站住!别跑,我又不收你钱,如果我的demo能够帮助到你,请给我一个赞吧!

你可能感兴趣的:(Java,itext,pdf)