在你看下面文章的时候,强烈建议看下:
关于使用iText库创建PDF文件详细说明:https://www.cnblogs.com/chenpi/p/5534595.html
作为学习,当然希望免费的可以利用一下就好。
推荐:(如果你有钱,还是可以卖一年的,也不是很贵)
首先我们制作需要的excel或者word模板,另存为pdf,利用软件进行编辑。
我们将上面的PDF利用软件编辑。
加水印等等结果如下:
接下来制作表单:

接下来为每一个需要填的内容添加文本域。
导包:
<!-- pdf实现 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</version>
</dependency>
程序:
pdf封装实体:
package com.poi.testpoi.pojo;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Data
@Getter
@Setter
public class PdfEntity {
private String dogNo;
private String name;
private Integer age;
private Integer dogYear;
private String brithday;
private String reason;
private String remark;
private String level;
private String ability;
private String summary;
}
控制层:
package com.poi.testpoi.controller;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.poi.testpoi.pojo.PdfEntity;
@Controller
public class PDFController {
@RequestMapping("/createPDF")
@ResponseBody
public String createPDF(HttpServletResponse response) throws DocumentException {
// 模板路径 关于路径最好放在配置文件中,我这里只想说明问题
String templatePath = "C:\\Users\\zy962\\Desktop\\temp.pdf";
// 生成文件路径
String filename = "testpdf.pdf";
// 创建对象
PdfEntity entity = new PdfEntity();
entity.setDogNo("NO123456");
entity.setName("周毅");
entity.setAge(26);
entity.setDogYear(4);
entity.setBrithday("93.11.18");
entity.setReason("已经失去了追人的能力。陷入了一个死循环:我主动找她吧,要是对我没感觉,找了不理我怎么办?于是还没尝试,就不去招惹别人了。");
entity.setRemark("并不是每一个单身的人,都代表可撩的状态,有的人早已经对恋爱不抱什么希望。只想好好学习,好好工作,然后发财。");
entity.setLevel("到了我这种境界后,就可以和寂寞和睦相处。若有了独自活下去的觉悟,慢慢变老也会充满乐趣。");
entity.setAbility("非常羡慕那些能一喜欢/一追就是几年的人,这种恒心,在他来说,一个月、不一个周都做不到,两天应该也许大概能做到。");
entity.setSummary("综上结论,面向对象是不存在的,面向过程是不存在的,汪汪汪一只。");
Map<String, Object> datas = new HashMap<String, Object>();
datas.put("name", entity.getName());
datas.put("dogNo", entity.getDogNo());
datas.put("age", entity.getAge());
datas.put("dogYear", entity.getDogYear());
datas.put("brithday", entity.getBrithday());
datas.put("reason", entity.getReason());
datas.put("remark", entity.getRemark());
datas.put("level", entity.getLevel());
datas.put("ability", entity.getAbility());
datas.put("summary", entity.getSummary());
PdfReader reader;
OutputStream os = null;
ByteArrayOutputStream baos = null;
PdfStamper stamper;
try {
os = response.getOutputStream();
// 读入pdf表单
reader = new PdfReader(templatePath);
baos = new ByteArrayOutputStream();
// 根据表单生成一个新的pdf
stamper = new PdfStamper(reader, baos);
// 获取pdf表单
AcroFields formTexts = stamper.getAcroFields();
// 设置字体(这里设置为系统字体,你也可以引入其他的字体),不设置很可能,中文无法显示。
BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
formTexts.addSubstitutionFont(bf);
// 数据查询后,值的植入 强烈推荐键值方式,其他方式很容易混
Set<String> keySet = datas.keySet();
for (String key : keySet) {
formTexts.setField(key, datas.get(key).toString());
}
stamper.setFormFlattening(true); // 这个必须设
stamper.close();
// 创建一个pdf实例
Document document = new Document();
PdfCopy copy = new PdfCopy(document, os);
document.open();
PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(baos.toByteArray()), 1);
copy.addPage(importedPage);
document.close(); // open和close一套
// 强制下载
//response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;fileName="
+ URLEncoder.encode(filename, "UTF-8"));
} catch (IOException e) {
e.printStackTrace();
} finally { // 最后一定要关闭流
try {
baos.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return "成功,请去查看";
}
}
运行结果:
我们发现内容并没有显示全,经过调查,Java内部是不能实现的。只能在制作pdf表单的时候设置。设置为多行即可。
我们更改后:
如果有更复杂的实现:再次建议参考:https://www.cnblogs.com/chenpi/p/5534595.html。写的非常的全。
还有就是这种设置具体位置也有可能会用到的。
// 通过域名获取所在页和坐标,左下角为起点
String imgpath="e:/aa.png";
int pageNo = form.getFieldPositions("img").get(0).page;
Rectangle signRect = form.getFieldPositions("img").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 读图片
Image image = Image.getInstance(imgpath);
// 获取操作的页面
PdfContentByte under = ps.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
版权声明:本文为weixin_42603009原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。