应用场景
在已经有了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。。。。。。。。。。。。。。。。