zoukankan      html  css  js  c++  java
  • java根据模板文件导出pdf

    原文:https://www.cnblogs.com/wangpeng00700/p/8418594.html

    在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护性,想想还是自己总结一个完全版的导出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.效果图如下:

     

  • 相关阅读:
    ubuntu创建桌面启动器
    UVA 题目11300 Spreading the Wealth
    js实现C#的Server.Encode和Server.Decode
    boost库在工作(20)线程之五
    rmmod: chdir(/lib/modules): No such file or directory
    例说uboot从命令到驱动
    java高级工程师struts的知识重点
    ThreadLocal简单学习
    [CSS]为什么不推荐在CSS中使用ID选择器
    laravel中将session由文件保存改为数据库保存
  • 原文地址:https://www.cnblogs.com/shihaiming/p/9591688.html
Copyright © 2011-2022 走看看