经过网上搜索大概有三种方式: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();
}
}
}
第三种参照,因为要借助外部工具,所以部署时候会稍微麻烦点,根据需要选自己的方式