• java模板导出PDF


     

    本次完善综合特点:

        一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷

        支持中文,可以使用自己下载的字体。

        支持图片:图片的大小范围可以在模板随意调,生成出来的图片不会超过范围。而且不需要根据坐标去算,程序里面自动计算的。

        支持多页模板,即使是好几页的模板,只要每个变量对应的范围确定好了,生成出来的格式就不会错乱。

     详细步骤和完整代码在下面。

    先放个效果图:

     

       

    下面是详细的步骤:

    1.首先,新建一个word文档,内容如下,另存为pdf格式,我的命名:mytest.pdf。    

        

    2.用Adobe Acrobat Pro 打开刚刚制作的pdf文件。如下图: 

        

    3.点击创建-->PDF表单-->使用当前文档-->使用当前文档,一直点下一步完成。(有的版本Adobe Acrobat Pro软件右边有准备表单,直接点击准备表单是同样的效果)

        

         

      

    4.上面好多给框,双击黑框可以修改名称,还可以设置字体大小,如下图

        

        

     5.图片的地方没有黑框,我们可以在空白处点击右键,选择文本域,给图片的域起名为img。

    6.如下图是制作好的pdf模板,直接保存即可。注意:黑框里面的名称,是后面程序要用到的,程序根据名称给对应的位置赋值的。不管你去什么名字,只要保证和程序里面的名字一直即可。

     7.pom.xml文件:

            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.4.3</version>
            </dependency>    

    8.工具类文件:

    我的模板是放在C盘下面的,所以路径是C:/mytest.pdf,另外,我还在C盘下面放了一张图片 c:/50336.jpg ,字体使用的是系统的字体,也可以自己到网上下载自己喜欢的字体文件,路径指向自己下载的字体文件路径即可

    复制代码
    package wp.util;
    
    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import com.itextpdf.text.*;
    import com.itextpdf.text.pdf.*;
    /**
     * Created by wangpeng on 2018/02/01.
     */
    public class PdfUtils {
        // 利用模板生成pdf  
        public static void pdfout(Map<String,Object> o) {
            // 模板路径  
            String templatePath = "C:/mytest.pdf";
            // 生成的新文件路径  
            String newPDFPath = "C:/testout1.pdf";
    
            PdfReader reader;
            FileOutputStream out;
            ByteArrayOutputStream bos;
            PdfStamper stamper;
            try {
                BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                Font FontChinese = new Font(bf, 5, Font.NORMAL);
                out = new FileOutputStream(newPDFPath);// 输出流
                reader = new PdfReader(templatePath);// 读取pdf模板  
                bos = new ByteArrayOutputStream();
                stamper = new PdfStamper(reader, bos);
                AcroFields form = stamper.getAcroFields();
                //文字类的内容处理
                Map<String,String> datemap = (Map<String,String>)o.get("datemap");
                form.addSubstitutionFont(bf);
                for(String key : datemap.keySet()){
                    String value = datemap.get(key);
                    form.setField(key,value);
                }
                //图片类的内容处理
                Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");
                for(String key : imgmap.keySet()) {
                    String value = imgmap.get(key);
                    String imgpath = value;
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    //根据路径读取图片
                    Image image = Image.getInstance(imgpath);
                    //获取图片页面
                    PdfContentByte under = stamper.getOverContent(pageNo);
                    //图片大小自适应
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    //添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                }
                stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
                stamper.close();
                Document doc = new Document();
                Font font = new Font(bf, 32);
                PdfCopy copy = new PdfCopy(doc, out);
                doc.open();
                PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
                copy.addPage(importPage);
                doc.close();
    
            } catch (IOException e) {
                System.out.println(e);
            } catch (DocumentException e) {
                System.out.println(e);
            }
    
        }
    
        public static void main(String[] args) {
            Map<String,String> map = new HashMap();
            map.put("name","张三");
            map.put("creatdate","2018年1月1日");
            map.put("weather","晴朗");
            map.put("sports","打羽毛球");
    
            Map<String,String> map2 = new HashMap();
            map2.put("img","c:/50336.jpg");
    
            Map<String,Object> o=new HashMap();
            o.put("datemap",map);
            o.put("imgmap",map2);
            pdfout(o);
        }
    }  
    复制代码

    9.效果图如下:

     

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/wangjintao-0623/p/10496524.html
Copyright © 2020-2023  润新知