java使用iText按模板生成PDF文件,含文本,图片,条形码,二维码
1.准备工作
通过百度下载adobe acrobat pro dc工具
2.操作流程新建一个Word文档内容就是你需要排好的文档格式,需要动态展示的值留空,比如:
模板画好以后另存为PDF格式
通过adobe acrobat pro dc工具打开保存好的PDF文件
点击右边准备表单
点击开始
图中的fill_i可以改成你自己的字段值,修改好以后另存为一个新的PDF,你也可以直接替换掉
java代码:
package com.pdf;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.AcroFields.FieldPosition;
import com.itextpdf.text.pdf.Barcode128;
import com.itextpdf.text.pdf.BarcodeQRCode;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
public class AA {
// 利用模板生成pdf
public static void pdfout(Map<String,Object> map) {
// 模板路径
String templatePath = "C:\\Users\\Administrator\\Desktop\\pdf(2).pdf";
// 生成的新文件路径
String newPDFPath = "C:/testout1.pdf";
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
//给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font FontChinese = new Font(bf, 5, Font.NORMAL);
// 输出流
out = new FileOutputStream(newPDFPath);
// 读取pdf模板
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
//遍历数据
Map<String,Object> datemap = (Map<String,Object>)map.get("datemap");
// 添加所创建的字体
form.addSubstitutionFont(bf);
for(String key : datemap.keySet()){
String value = datemap.get(key).toString();
form.setField(key,value);
}
Map<String,Object> qrcodeFields=(Map<String, Object>) map.get("qrcodeFields");
//遍历二维码字段
for (Map.Entry<String, Object> entry : qrcodeFields.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 获取属性的类型
if(value != null && form.getField(key) != null){
//获取位置(左上右下)
FieldPosition fieldPosition = form.getFieldPositions(key).get(0);
//绘制二维码
float width = fieldPosition.position.getRight() - fieldPosition.position.getLeft();
BarcodeQRCode pdf417 = new BarcodeQRCode(value.toString(), (int)width, (int)width, null);
//生成二维码图像
Image image128 = pdf417.getImage();
//绘制在第一页
PdfContentByte cb = stamper.getOverContent(1);
//左边距(居中处理)
float marginLeft = (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - image128.getWidth()) / 2;
//条码位置
image128.setAbsolutePosition(fieldPosition.position.getLeft() + marginLeft, fieldPosition.position.getBottom());
//加入条码
cb.addImage(image128);
}
}
//遍历条码字段
Map<String,Object> barcodeFields=(Map<String, Object>) map.get("barcodeFields");
for (Map.Entry<String, Object> entry : barcodeFields.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 获取属性的类型
if(value != null && form.getField(key) != null){
//获取位置(左上右下)
FieldPosition fieldPosition = form.getFieldPositions(key).get(0);
//绘制条码
Barcode128 barcode128 = new Barcode128();
//字号
barcode128.setSize(10);
//条码高度
barcode128.setBarHeight(35);
//条码与数字间距
barcode128.setBaseline(10);
//条码值
barcode128.setCode(value.toString());
barcode128.setStartStopText(false);
barcode128.setExtended(true);
//绘制在第一页
PdfContentByte cb = stamper.getOverContent(1);
//生成条码图片
Image image128 = barcode128.createImageWithBarcode(cb, null, null);
//左边距(居中处理)
float marginLeft = (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - image128.getWidth()) / 2;
//条码位置
image128.setAbsolutePosition(fieldPosition.position.getLeft() + marginLeft, fieldPosition.position.getBottom());
//加入条码
cb.addImage(image128);
}
}
//图片类的内容处理
Map<String,String> imgmap = (Map<String,String>)map.get("imgmap");
for(String key : imgmap.keySet()) {
String value = imgmap.get(key);
String imgpath = value;
int pageNo = form.getFieldPositions(key).get(0).page;
Rectangle signRect = form.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
//根据路径读取图片
Image image = Image.getInstance(imgpath);
//获取图片页面
PdfContentByte under = stamper.getOverContent(pageNo);
//图片大小自适应
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
//添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
stamper.setFormFlattening(true);
stamper.close();
Document doc = new Document();
Font font = new Font(bf, 20);
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//文本内容map
Map<String,Object> map = new HashMap<String, Object>();
map.put("fill_1","文本内容展示");
//条形码map
Map<String,Object> barcodeFields = new HashMap<String, Object>();
barcodeFields.put("fill_2","12345678910");
//图片
Map<String,Object> imgmap = new HashMap<String, Object>();
imgmap.put("fill_3","C:\\Users\\Administrator\\Desktop\\tu.png");
//二维码map
Map<String,Object> qrcodeFields = new HashMap<String, Object>();
qrcodeFields.put("fill_4","https://blog.****.net/qq_26173219");
//组装map传过去
Map<String,Object> o=new HashMap<String, Object>();
o.put("datemap",map);
o.put("barcodeFields",barcodeFields);
o.put("qrcodeFields",qrcodeFields);
o.put("imgmap",imgmap);
//执行
pdfout(o);
}
}
感谢阅读!
本帖子参考内容来源于网络;具体请了解:
https://blog.****.net/qq_26173219/article/details/81629038