Java实现导出内容为PDF格式

先看一下导出的PDF效果图简单版
PDF效果

导出内容为PDF格式基本流程:

先创建一个word文档,我这边命名为:mytest,并写好你要输出内容的固定信息。
word文档模板
再将此word文档另存为pdf格式,我放到了我本地的D盘下。
在这里插入图片描述

然后用Adobe Acrobat Pro 打开刚刚制作的pdf文件(没有Adobe Acrobat Pro的自己去官网下载)在这里插入图片描述

打开后是这样:
在这里插入图片描述
点击左上角的创建,并点击“创建表单”
在这里插入图片描述
然后选择“从现有文档创建”
在这里插入图片描述
依次点击“下一步”,“继续”。这时会出现下框,不用管它直接点确定就好
在这里插入图片描述
然后鼠标右键点击空白处,选择“文本域(T)”
在这里插入图片描述
设置好域名称,域名称就是输出pdf中每个字段的内容,是一个变量
域名称
域名称设置完了(域名称要对应上java代码中的字段)。
在这里插入图片描述
点击右上角的“文件”,另存一下
在这里插入图片描述
我存到了本地D盘 mytest5.pdf
在这里插入图片描述
打开mytest5.pdf是这样
在这里插入图片描述
到此为止,整个PDF模板做好了。下面开始写工具类:

导入依赖

!--导出pdf-->
<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itextpdf</artifactId>
	<version>5.4.3</version>
</dependency>

工具类

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.*;

public class PdfUtils {

    // 利用模板生成pdf
    public static void pdfout(Map<String,Object> o) {
        // 模板路径
        String templatePath = "D:/mytest5.pdf";
        // 生成的新文件路径
        String newPDFPath = "D:/testout2.pdf";

        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            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");
            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();
            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中的键要对应设置好的PDF模板中域名称
        map.put("partsName","张三");
        map.put("num","12");
        map.put("price","123");
        map.put("purchasePrice","100.5");
        map.put("manHourFee","15");
        map.put("totalPay","565");

        Map<String,String> map2 = new HashMap();
        // 图片路径
        map2.put("img","d:/cheliang01.jpg");

        Map<String,Object> o=new HashMap();
        o.put("datemap",map);
        o.put("imgmap",map2);
        pdfout(o);
    }
}

在main方法里运行,PDF就导出了。
在这里插入图片描述
下面就是导出后的PDF效果,很简单效果图,现实中可以根据需求自己添加变量,域名称。
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值