JAVA实现导出PDF功能

1.下载Adobe破解版PDF编辑软件(已上传请自取 解压密码@vposy)

下载安装 就是这么个东西
在这里插入图片描述

2. 创建/编辑模板PDF文件表单

在这里插入图片描述
这一个个的灰色格子就是表单元素,待会就可以通过java代码去给其赋值,双击表单元素配置样式。
在这里插入图片描述
“名称”就是取一个标识名称,待会java代码直接给这个标识赋值。
在这里插入图片描述
随便统一一下文字大小、字体,免得后面样式不统一,内容巨难看。一般情况下都是用户发来的word直接转成pdf,然后增加表单元素,修改样式,就下来就是填充内容。

3.搞个JAVA工具类填充一下表单元素内容


import java.awt.image.BufferedImage;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class PdfDown {
	/**
	 * @param inputmap 填充内容
	 * @param templatePath 模板路径
	 * @param response
	 * @param request
	 * @return
	 */
	public static String pdfout(Map<String, String> inputmap, String templatePath, HttpServletResponse response, HttpServletRequest request) {
		// 生成的新文件路径
		String fileName = "随便取个名字" + "_" + DateFormatUtils.format(new Date(), "yyyyMMddhhmmss") + ".pdf";
		String newPDFPath = templatePath + File.separator + fileName;

		// 模板路径
		templatePath = templatePath + File.separator + "模板哦.pdf";
		
		try {
			FileOutputStream out;
			// 取pdf模板页数
			int num = new PdfReader(templatePath).getNumberOfPages();
			ByteArrayOutputStream bos[] = new ByteArrayOutputStream[num];
			// 输出流
			out = new FileOutputStream(newPDFPath);
			// 新建一个文档
			Document doc = new Document();
			// 用于保存原页面内容,然后输出
			PdfCopy copy = new PdfCopy(doc, out);
			doc.open();
			for (int i = 0; i < num; i++) {
				bos[i] = new ByteArrayOutputStream();
				// 读取pdf模板
				PdfReader reader = new PdfReader(templatePath);
				PdfStamper stamper = new PdfStamper(reader, bos[i]);
				// 获取文本域
				AcroFields form = stamper.getAcroFields();
				form.addSubstitutionFont(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));
				// 文字类的内容处理
				Map<String, String> datemap = inputmap;
				for (String key : datemap.keySet()) {
					String value = datemap.get(key);
					if (StringUtils.isNotEmpty(value)) {
						form.setField(key, value, true);
					} else {
						form.setField(key, "");
					}
				}
				// 如果为false那么生成的PDF文件还能编辑,一定要设为true
				stamper.setFormFlattening(true);
				stamper.close();
			}

			PdfImportedPage page;
			for (int i = 0; i < num; i++) {
				page = copy.getImportedPage(new PdfReader(bos[i].toByteArray()), i + 1);
				copy.addPage(page);
			}

			doc.close();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return newPDFPath;
	}
}

总结:表单元素有多种,注意踩坑,复选和单选需要注意,搞成下面这样设置的话字段内容要是字符串的true或false,不然赋值不了,其他问题可以留言。

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值