您的位置:首页 > 其它

Itext操作pdf模板生成pdf

2017-04-21 13:12 1131 查看

根据pdf模板导出pdf文件

设置pdf模板的表单域



如下代码:

package com.dogoserver.user.controller;

import java.io.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.*;

@Controller
public class PdfDemoController {

@RequestMapping("/pdfDemo.do")
public void pdfDemo(HttpServletRequest request, HttpServletResponse response) throws Exception{

response.reset();
ByteArrayOutputStream ba = new ByteArrayOutputStream();
/* 打开已经定义好字段以后的pdf模板 */
String TemplatePDF = request.getSession().getServletContext().getRealPath("WEB-INF/pdf") + "/report.pdf";
System.out.println(TemplatePDF);
try {
PdfReader reader = new PdfReader(TemplatePDF);

/* 将要生成的目标PDF文件名称 */
PdfStamper stamp = new PdfStamper(reader, ba);
//PdfContentByte under = stamp.getUnderContent(1);

/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bf, 12, Font.NORMAL);

/* 取出报表模板中的所有字段 */
AcroFields form = stamp.getAcroFields();

/* 为字段赋值,注意字段名称是区分大小写的 */
form.setField("name", "lixy");

/* 为字段赋值图片 */
insertImage(stamp, form);

stamp.setFormFlattening(true);
/* 必须要调用这个,否则文档不会生成的 */
stamp.close();

} catch (IOException e) {
e.printStackTrace();
System.err.println("A Document error:" + e.getMessage());
}
response.setContentType("application/pdf");

/* 如果想出来让IE提示你是打开还是保存的对话框,加上下面这句就可以了 */
response.setHeader("Content-disposition","attachment; filename=report.pdf" );
response.setContentLength(ba.size());

ServletOutputStream out = response.getOutputStream();
ba.writeTo(out);
out.flush();
out.close();
ba.close();
}

/**
* 插入图片
* @param ps
* @param s
* @throws Exception
*/
public static void insertImage(PdfStamper ps, AcroFields s) throws Exception {

/**
* 因为直接向域中插入图片没有直接的方法(也许有,但是可能我没有找到)
* 采用的是获取域的方式在指定位置插入表格
*/
//要插入图片的字段在第几页
PdfContentByte under = ps.getOverContent(5);
//获取字段的坐标
float[] fieldPosition = s.getFieldPositions("age");
float left = fieldPosition[1];
float right = fieldPosition[3];
float top = fieldPosition[4];
float bottom = fieldPosition[2];
System.out.println("left------->" + left);
System.out.println("right------->" + right);
System.out.println("top------->" + top);
System.out.println("bottom------->" + bottom);

//文件形式
Image image = Image.getInstance("D:/testImg.png");

//流形式
//byte[] bytes = toByteArray("D:/testImg.png");
//Image image = Image.getInstance(bytes);

//位置,大小自己进行调整
image.setAbsolutePosition(left, bottom);
image.scaleToFit(right-left, top-bottom);

under.addImage(image);

}

/**
* java 读取文件并转换为byte数组
* @param filePath
* @return
* @throws Exception
*/
public static byte[] toByteArray(String filePath) throws Exception{
InputStream in = new FileInputStream(filePath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
byte[] bytes = out.toByteArray();
return bytes;
}

}


导出pdf文件效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: