java中将表单转换为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的更多相关文章
- java 防止表单重复提交(serlvet)
java 防止表单重复提交 ---------FormServlet.java-------------- protected void doGet(HttpServletRequest reques ...
- java工具类(二)之java正则表达式表单验证
java正则表达式表单验证类工具类(验证邮箱.手机号码.qq号码等) 这篇文章主要介绍了java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等方法,需要的朋友可以参考下. jav ...
- java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例
java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...
- 将forme表单转换为Json对象
//将Form 表单转换为Json字符串 $.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); ...
- Java 中将字符串数组转换为字符串
Java 中将字符串数组转换为字符串 import java.util.Arrays; import java.util.HashSet; import java.util.Set; public c ...
- java后台表单验证工具类
/** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...
- Java模拟表单POST上传文件
JAVA模拟表单POST上传文件 import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.io ...
- Unity3D与JSP TomCatserver传递数据和文件( 二 ) Unity3D向java传输表单
扫码关注微信公众号,获取最新资源 经历了一天的工作.我又来更新啦...白天手欠,把上一个给删了.明天重写吧.. 废话不多说.我们先去Unity里创建一个能够输入username和password的登录 ...
- java防止表单重复提交
用session防止表单重复提交 思路:在服务器端生成一个唯一的随机标识串Token,同时在当前用户的Session域中保存这个Token.然后将Token发送到客户端的Form表单中,在Form表单 ...
随机推荐
- leetcode python 011
####给定n个非负整数a1,a2,...,an,其中每个表示坐标(i,ai)处的点.##绘制n条垂直线,使得线i的两个端点位于(i,ai)和(i,0).##找到两条线,它们与x轴一起形成一个容器,这 ...
- 阶段01Java基础day22IO流03
22.01_IO流(序列流) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方式 整合 ...
- 最短路,dijstra算法
#include<iostream> #include<stdio.h> #include<math.h> #include<vector> using ...
- git的基本用法——我的日常使用
git的基本用法 一,前言 网上有太多关于git的用法说明,而我看得云里雾里,可能是本人比较愚笨.平常时间老问别人又觉得很不好意思,估计大多的同学们都是自己解决.后来我想到了买一本书,淘宝上git书籍 ...
- 如何使用HackRF做一个简单的IMSI捕获器
关于IMSI IMSI为国际用户识别码(International Mobile Subscriber Identity)的缩写,是用于区分蜂窝网络中不同用户的,在所在蜂窝网络中不重复的识别码.IMS ...
- 创建cocoapod静态库发布到网上使用
1,在github上创建一个空仓库,要有licence和readme,clone到本地 2,pod lib create 项目名,这样就创建了一个静态库 3,pod spec create 项目名,创 ...
- spring(一、原理、IOC、AOP、依赖注入)
1.spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运 ...
- flask自定义转换器
根据具体的需求,有些时候是需要用到正则来灵活匹配URL,但是Flask的路由匹配机制是不能直接在路由里直接写正则的,这时候就需要使用转换器! Flask的默认转换器: DEFAULT_CONVERTE ...
- python 4
一.列表相关操作 l = ['布偶猫', '小断腿', '大白'] # . append l.append('哎呀') print(l) # . insert l.insert(, '小猪佩琪') p ...
- “轻量级JavaEE”之新学期目标
我以后的职业目标是做一名Java开发工程师.之前学了一些JAVA的基础知识,也学了一些C,但以现在的知识储备和实战能力是不能胜任企业开发实战的要求的,所以这门“轻量级JavaEE企业应用实战”对我的提 ...