使用itextpdf及Adobe Acrobat Pro准备表单来实现报表

      在java中创建一张pdf报表,如果所有内容都由程序去生成,如果内容少可能没有什么,如果内容太多那将是工作巨大。在这里如果一些报表虽然复杂,但只需要填特定的数据上去就能实现在报表,这时候用Adobe Acrobat Pro里的准备表单功能就能大大减少工作量了。

使用itextpdf及Adobe Acrobat Pro准备表单来实现报表_spring

下面开始制作:这里测试,用wps创建一个简单的doc,输出为pdf, 然后用Adobe Acrobat Pro打开这个PDF文件,在右下角有一个"更多工具",打开找到准备表单

使用itextpdf及Adobe Acrobat Pro准备表单来实现报表_表单_02

使用itextpdf及Adobe Acrobat Pro准备表单来实现报表_spring_03

点击“开始”进入准备表单 设计

使用itextpdf及Adobe Acrobat Pro准备表单来实现报表_表单_04

在设计界面上添加表单域

使用itextpdf及Adobe Acrobat Pro准备表单来实现报表_spring_05


使用itextpdf及Adobe Acrobat Pro准备表单来实现报表_表单_06

 主要代码如下:


import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.ldg.test.modal.User;
import com.ldg.test.modal.UserView;
import com.ldg.test.service.IUserService;
import com.ldg.test.service.IUserViewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

@Controller
public class Rep2Controller {
    @Autowired
    private IUserViewService service;

    @RequestMapping("/rep2/{id}")
    public void showEditUserForm(@PathVariable(name = "id") Long id,
                                 HttpServletRequest request, HttpServletResponse response) throws IOException {
        UserView userView = service.get(id);
        String f = "用户档案_" + userView.getName() + ".pdf";
        //设置请求返回类型
        String downFilename = new String(f.getBytes("UTF-8"), "ISO-8859-1");
        response.setHeader("Content-Disposition", "attachment; filename=" + downFilename);
        String filePdf = "user.pdf";
        //模板路径,放到项目里用这个ClassPathResource
        String filePathPdf = "templates/pdf/" + filePdf;
        ClassPathResource classPathResource = new ClassPathResource(filePathPdf);
        InputStream inputStream = classPathResource.getInputStream();
        Map<String, String> map = new HashMap<>();
        map.put("name", userView.getName());
        map.put("address", userView.getAddress());
        map.put("phone", userView.getPhone());
        map.put("depName", userView.getDepName());
        map.put("remark", userView.getRemark());
        PdfReader reader;
        PdfStamper stamper;
        OutputStream out = response.getOutputStream();
        try {
            reader = new PdfReader(inputStream);// 读取pdf模板
            stamper = new PdfStamper(reader, out);
            AcroFields form = stamper.getAcroFields();
            //遍历map装入数据
            for (Map.Entry<String, String> entry : map.entrySet()) {
                form.setField(entry.getKey(), entry.getValue());
                //System.out.println("插入PDF数据---->  key= " + entry.getKey() + " and value= " + entry.getValue());
            }
            stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
            stamper.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

pom.xml

		<!--itextpdf PDF依赖-->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.9</version>
		</dependency>
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>