使用itextpdf及Adobe Acrobat Pro准备表单来实现报表
在java中创建一张pdf报表,如果所有内容都由程序去生成,如果内容少可能没有什么,如果内容太多那将是工作巨大。在这里如果一些报表虽然复杂,但只需要填特定的数据上去就能实现在报表,这时候用Adobe Acrobat Pro里的准备表单功能就能大大减少工作量了。
下面开始制作:这里测试,用wps创建一个简单的doc,输出为pdf, 然后用Adobe Acrobat Pro打开这个PDF文件,在右下角有一个"更多工具",打开找到准备表单
点击“开始”进入准备表单 设计
在设计界面上添加表单域
主要代码如下:
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>