经过网上搜索大概有三种方式:PDF模板数据填充,html代码转换pdf,借用wkhtmltopdf工具
一 .PDF模板数据填充
1.新建word,在word中做出和表单一样的布局的空表单,然后另存为pdf;
2.用pdf编辑工具,用准备表单这个工具在需要填充动态数据的地方设置文本框或图像框,起好标签名。
3.根据标签名向pdf中插入数据,并将PDF导出在指定位置。
            String rootPath="d:/";
String path=rootPath+"dzyjjsdjd.pdf";
System.out.println("电子文件移交与接收登记单模板位置:"+path);
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
String newPath=rootPath+df.format(new Date())+"dzyjjsdjd.pdf";
//读入pdf表单
PdfReader reader = new PdfReader(path);
//根据表单生成一个新的pdf
PdfStamper ps = new PdfStamper(reader,new FileOutputStream(newPath));
//获取pdf表单
AcroFields s = ps.getAcroFields();
//给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
s.addSubstitutionFont(bf);
//遍历pdf表单表格,同时给表格赋值
Map<String,String> paraMap=getMapData(accept);//自己的数据,按模板中设置的表单标签封装进map
for (String key : paraMap.keySet()) {
if(key.equals("yz1")){//获取标签为yz1的pdf标签,设置其值
String value = paraMap.get(key);
tempImgPath1=rootPath+"yz1.png";
insertImage(ps, tempImgPath1,"yz1",s);
//图片插入后需要去除掉设置的这个图片框,否则会遮当前插入的图片
s.removeField("yz1");
}else{
String value = paraMap.get(key);
s.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
} }
ps.setFormFlattening(true); // 这句不能少
ps.close();
reader.close();
/**
* 向pdf中插入图片
* @param ps pdf对象
* @param img 需要插入的图片路径
* @param col 需要插入图片的pdf字段标签名
* @param s pdf字段
*/
public void insertImage(PdfStamper ps, String img,String col,AcroFields s){
try{
List<AcroFields.FieldPosition> list = s.getFieldPositions(col);
Rectangle signRect = list.get(0).position; Image image = Image.getInstance(img);
PdfContentByte under = ps.getOverContent(1); //要插入图片的页数,现在只有1页
float x = signRect.getLeft();
float y = signRect.getBottom();
System.out.println(x);
System.out.println(y);
image.setAbsolutePosition(x, y);
image.scaleToFit(signRect.getWidth(), signRect.getHeight()); under.addImage(image);
}
catch (Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 插入文本
*
* @return
* @author WangMeng
* @date 2016年6月16日
*/
public static void insertText(PdfStamper ps, AcroFields s)
{
List<AcroFields.FieldPosition> list = s.getFieldPositions("CONNECT_NAME");
Rectangle rect = list.get(0).position; PdfContentByte cb = ps.getOverContent(1);
PdfPTable table = new PdfPTable(1);
float tatalWidth = rect.getRight() - rect.getLeft() - 1;
table.setTotalWidth(tatalWidth); PdfPCell cell = new PdfPCell(new Phrase(CreateChunk()));
cell.setFixedHeight(rect.getTop() - rect.getBottom() - 1);
cell.setBorderWidth(0);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setLeading(0, (float) 1.1); table.addCell(cell);
table.writeSelectedRows(0, -1, rect.getLeft(), rect.getTop(), cb);
}

第二种:将html代码转换为pdf

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream; import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper; public class HtmlToPDF {
public static void main(String[] args) {
try {
Document document = new Document(PageSize.LETTER);
PdfWriter pdfWriter = PdfWriter.getInstance(document,
new FileOutputStream("c://temp//testpdf.pdf"));
document.open();
document.addAuthor("ysjiang");
document.addCreator("ysjiang");
document.addSubject("test");
document.addCreationDate();
document.addTitle("XHTML to PDF"); XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); String str = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\">"
+ "<head>"
+ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"
+ "<title>HTML 2 PDF</title>"
+ "<style type=\"text/css\">"
+ "<!--"
+ "body {"
+ " margin: 20px;"
+ "}"
+ "-->"
+ "</style>"
+ "</head>"
+ "<body>"
+ "<div style=\"width:90%; height:160px;\">多情浪漫的人,其实内心的情感是非常脆弱的,感情的末梢,有那么一点儿敏感,还有那么一点儿想入非非。所以和浪漫多情的人在一起,言语一定要斯文,说话不能像火炮,态度一定要温柔、语气也要婉转。遇到对方的一个眼神,也许有些人并没发现什么端倪,但是放在懂得浪漫的人身上,就会体会出万种滋味,百般柔情来。"
+ "</div>"
+ "<hr/>"
+ "<table cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%; border:1px;\">"
+ " <tr>"
+ " <td style=\"width:30%\">table中的中文显示及换行"
+ " </td>"
+ " <td>多情浪漫的人,其实内心的情感是非常脆弱的,感情的末梢,有那么一点儿敏感,还有那么一点儿想入非非。所以和浪漫多情的人在一起,言语一定要斯文,说话不能像火炮,态度一定要温柔、语气也要婉转。遇到对方的一个眼神,也许有些人并没发现什么端倪,但是放在懂得浪漫的人身上,就会体会出万种滋味,百般柔情来。"
+ " </td>"
+ " </tr>"
+ " <tr>"
+ " <td colspan=\"2\">"
+ " <img src=\"0.jpg\" />"
+ " </td>"
+ " </tr>"
+ "</table>" + "</body>" + "</html>";
// worker.parseXHtml(pdfWriter, document, new FileInputStream("C:\\tmp\\a.htm"), null, new AsianFontProvider());
String url="G:/workProject_ces/zjdzyjjsxt/WebRoot/module/receive/register/input.jsp?pid=4&sign=0&tagg=undo&workitemId=149982394754705&activityName=rk&returnReason=&activityId=receive&time=Mon Jul 17 2017 14:25:49 GMT+0800 (中国标准时间)";
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(str.getBytes()), null, new AsianFontProvider());
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,
new FileInputStream(url));
document.close();
System.out.println("Done.");
} catch (Exception e) {
e.printStackTrace();
}
} }

第三种参照http://blog.csdn.net/zhangkezhi_471885889/article/details/52184700,因为要借助外部工具,所以部署时候会稍微麻烦点,根据需要选自己的方式

java中将表单转换为PDF的更多相关文章

  1. java 防止表单重复提交(serlvet)

    java 防止表单重复提交 ---------FormServlet.java-------------- protected void doGet(HttpServletRequest reques ...

  2. java工具类(二)之java正则表达式表单验证

    java正则表达式表单验证类工具类(验证邮箱.手机号码.qq号码等) 这篇文章主要介绍了java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等方法,需要的朋友可以参考下. jav ...

  3. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...

  4. 将forme表单转换为Json对象

    //将Form 表单转换为Json字符串 $.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); ...

  5. Java 中将字符串数组转换为字符串

    Java 中将字符串数组转换为字符串 import java.util.Arrays; import java.util.HashSet; import java.util.Set; public c ...

  6. java后台表单验证工具类

    /** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...

  7. Java模拟表单POST上传文件

    JAVA模拟表单POST上传文件 import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.io ...

  8. Unity3D与JSP TomCatserver传递数据和文件( 二 ) Unity3D向java传输表单

    扫码关注微信公众号,获取最新资源 经历了一天的工作.我又来更新啦...白天手欠,把上一个给删了.明天重写吧.. 废话不多说.我们先去Unity里创建一个能够输入username和password的登录 ...

  9. java防止表单重复提交

    用session防止表单重复提交 思路:在服务器端生成一个唯一的随机标识串Token,同时在当前用户的Session域中保存这个Token.然后将Token发送到客户端的Form表单中,在Form表单 ...

随机推荐

  1. 遇见 TiDB

    遇见 TiDB 文章来源:企鹅号 - 塔塔驿站 最近TiDB掀起了一波分布式数据库的热潮,公司也在着手准备TiDB的落地工作,前几天也参与了几场公司针对TiDB的分享会,下面我们了解一下关于TiDB. ...

  2. 调用shutdown.sh后出现could not contact localhost8005 tomcat may not be running报错问题

    之前调用tomcat的shutdown.sh无法关闭tomcat,一直报could not contact localhost8005 tomcat may not be running错. 在网上找 ...

  3. NVMe协议1.3c(一) 概述

    刚开始接触NVMe,对此理解不深,如有错误敬请指出 1.1概述 NVM ExpressTM(NVMeTM)接口允许主机软件与非易失性存储器子系统通信. 此接口针对企业和客户端固态驱动器进行了优化,通常 ...

  4. Apple IAP Subscriptions

    Apple Doc: https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/ ...

  5. Python全栈之路----三元运算

    · 三元运算又称三目运算,是对简单条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成立 else 2 &g ...

  6. C++之string类型详解

    C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...

  7. zabbix客户端的安装、zabbix主被动模式、添加主机模板等、处理页面的中文乱码

    1.zabbix客户端的安装: 如下步骤: wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch. ...

  8. Ubuntu16.04安装yum的一种方式

    1. 首先检测是否安装 build-essential 包 sudo apt-get install build-essential 2.安装yum sudo apt-get install yum ...

  9. 让docker容器开机启动

    网上有些文章说,要让docker 的容器自动在开机启动,是写脚本,比如在 rc.local 中写.其实完全没必要这么麻烦,docker 有相关指令,docker run 指令中加入 --restart ...

  10. cookie和session的关联关系