最近开始接触到系统中开始有打印的功能了,而对于打印功能的实现有很多种方式,比如说在浏览器中调用window的print方法,或者是通过生成pdf文档来打印。
我自认为两者都各自有优缺点,使用window的print的优点在于:实现起来比较简单,样式什么的都比较好调试。缺点在于:排版布局太痛苦了,使用pdf来打印的优点在于:你可以很好的控制排版布局,将模板定义好之后,基本上都是一劳永逸了。缺点在于浏览器等待的时间比较长。而且还跟客户端的adoberead版本有关,好像9.3不支持这个功能。
而我采用的是使用pdf模板的方式来生成pdf。实现步骤,第一部做一个wold文档,稍微调整一下字体格式,布局。
最近增加了一个功能就是将动态生成的一个图片加入到pdf中的某一个位置。
如图:(word)
完成之后,直接使用Adobe Acrobat 8 Professional这个软件将world转换成pdf文件。
得到的pdf文件如下图:
然后使用Adobe Acrobat 8 Professional软件编辑表单完成之后如下图:
然后就可以使用java程序,通过itext的API,加上亚洲语言包,不过建议最好是使用相同的版本。以免一些命名空间不一致导致报一些莫名其妙的错出来。
package pdfTest; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.springframework.util.ResourceUtils; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; public class PDFTest { public static void main(String[] args) { try { FileOutputStream pos = new FileOutputStream(new File("D:\\test.pdf")); InputStream is = ResourceUtils.getURL("classpath:pdfTemplate.pdf").openStream();; // 目标输出流 PdfReader reader = new PdfReader(is); PdfStamper stamp = new PdfStamper(reader, pos); StringBuffer script = new StringBuffer(); //给pdf加上脚本实现自动掉打印机,然后自动关闭 script.append("this.print({bUI: false,bSilent: true,bShrinkToFit: false});"); //自动关闭的脚本 //.append("\r\nthis.closeDoc();"); stamp.addJavaScript(script.toString()); // 插入水印; Image img = Image.getInstance("D:/stsWorkspace/pdfTest/source/742.jpg"); img.setAbsolutePosition(50, 680); PdfContentByte over = stamp.getOverContent(1); over.addImage(img); AcroFields form = stamp.getAcroFields(); //通过属性名来赋值 form.setField("orderCode", "DD0045784-897"); form.setField("orderPrice", "78.99"); form.setField("receiveName", "艾伦"); form.setField("cellphone", "021-14579896"); form.setField("mobile", "16898654789"); form.setField("ispos", "是"); form.setField("address", "银河系太阳系地球亚洲中国内蒙古自治区亚历山大市亚历山大县亚历山大镇亚里士多德乡哥伦布村长寿街3号"); for(int i=0;i<2;i++){ form.setField("stockNo"+i, "789558554"); form.setField("number"+i, "2"); form.setField("price"+i, "40"); } stamp.setFormFlattening(true); stamp.close(); //输出文件,关闭流 pos.flush(); pos.close(); } catch (Exception e) { e.printStackTrace(); } } }
呵呵,附件是项目的源码,以及模板文件。