标签:for 中文字体 赋值 布局 定位 public div 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,因为要借助外部工具,所以部署时候会稍微麻烦点,根据需要选自己的方式
标签:for 中文字体 赋值 布局 定位 public div pdf 系统
原文地址:http://www.cnblogs.com/taleche/p/7204492.html