应用场景
在已经有了PDF模板,只需要我们动态填充一下数据的情况下,例如PDF报表,发票等
需要的jar包
还要准备一个PDF模板,和xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <FormDefine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Config> <Filed name="Name" > <Page>1</Page> <X>78</X> <Y>650</Y> <Font>楷体gb2312</Font> <Size>20</Size> </Filed> <Filed name="Bank" > <Page>1</Page> <X>245</X> <Y>650</Y> <Font>楷体gb2312</Font> <Size>20</Size> </Filed> <Filed name="CityName"> <Page>1</Page> <X>445</X> <Y>650</Y> <Font>楷体gb2312</Font> <Size>20</Size> </Filed> </Config> </FormDefine>
接下来直接上Java代码
public void makePdf(String xmlPath, String pdfPath, String resultPath, HashMap<String, String> map) throws DocumentException, IOException, Exception { PdfReader pdfReader = null; PdfStamper pdfStamper = null; FileOutputStream fileOutputStream = null; SAXReader saxReader = new SAXReader(); if (!this.makedir(resultPath)) { System.out.println("创建目录失败"); } else { File xmlfile = new File(xmlPath); // dom4j读取xml文件得到根元素 Element rootElement = saxReader.read(xmlfile).getRootElement(); // 以文件流形式输入PDF文件 FileInputStream in = new FileInputStream(pdfPath); fileOutputStream = new FileOutputStream(resultPath); pdfReader = new PdfReader(in); pdfStamper = new PdfStamper(pdfReader, fileOutputStream); // "Config"xml二級標簽,返回一個迭代器 for ( Iterator it = this.getElementIterator(rootElement, "Config"); it.hasNext();) { Element element = (Element) it.next(); Attribute attributeName = element.attribute("name"); String name = ""; if (attributeName != null) { name = attributeName.getValue(); } String value = ""; if (map.containsKey(name)) { value = (String) map.get(name); } else { continue; } // 獲取node節點個數 int count = element.nodeCount(); System.out.println(count+"======="); int page = 0; float x = 0; float y = 0; String font = ""; int size = 0; for (int j = 0; j < count; j++) { Node node = element.node(j); // 對比該節點是不是一個元素 if (node instanceof Element) { if (node.getName().equals("Page")) page = Integer.parseInt(node.getText()); if (node.getName().equals("X")) x = Float.parseFloat(node.getText()); if (node.getName().equals("Y")) y = Float.parseFloat(node.getText()); if (node.getName().equals("Font")) font = node.getText(); if (node.getName().equals("Size")) size = Integer.parseInt(node.getText()); } } PdfContentByte over; over = pdfStamper.getOverContent(page); over.beginText(); BaseFont bfChinese=this.getBaseFont(font); over.setFontAndSize(bfChinese, size); over.setColorFill(Color.blue); /** * 參數説明 * 左、右、居中(ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT) * 要输出的文本 * 文本输入的X坐标 * 文本输入的Y坐标 * 文本的旋转角度 */ over.showTextAligned(PdfContentByte.ALIGN_LEFT, value, x, y, 0); over.endText(); System.out.println("結束====="); } if(pdfReader!=null){ try{ pdfReader.close(); }catch(Exception e){ e.printStackTrace(); } } if (pdfStamper != null) { try { pdfStamper.close(); } catch (Exception e) { e.printStackTrace(); } } if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } } private BaseFont getBaseFont(String font) throws com.lowagie.text.DocumentException, IOException { if("楷体gb2312".equalsIgnoreCase(font)){ BaseFont bfChinese = BaseFont.createFont("C:/Users/qinda/Desktop/Excel/pdf/test/simkaiGBK.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); return bfChinese; } return null; } public static boolean makedir(String resultPath) { try { File file = new File(resultPath); if(!file.exists()) { System.out.println("目录创建成功。。。。。。。。。。"); file.createNewFile(); }else { System.out.println("目录已存在"); } } catch (Exception e) { return false; } return true; } public static Iterator<Element> getElementIterator(Element rootElement,String elementName){ Iterator<Element> iterator = null; for(Iterator<Element> it = rootElement.elementIterator();it.hasNext();) { Element element = it.next(); if(element.getName().equals(elementName)) { iterator = element.elementIterator(); } } return iterator; } }
测试代码
public static void main(String[] args) throws DocumentException, IOException, Exception { String resultPath ="C:/Users/qinda/Desktop/Excel/pdf/test/結果.pdf"; String pdfPath = "C:\Users\qinda\Desktop\pdf\模板.pdf"; String xmlPath = "C:\Users\qinda\Desktop\pdf\aa.xml"; HashMap<String,String> map = new HashMap<>(); map.put("Name", "12345667"); map.put("CityName", "北京"); map.put("Bank", "12345667"); MakePdf makePdf = new MakePdf(); // map是要插入的數據 makePdf.makePdf(xmlPath, pdfPath, resultPath,map); }
说明下:需要填充的数据用xml中的<X> <Y>的标签来调整位置。end。。。。。。。。。。。。。。。。