先导入依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.1.3</version>
</dependency>
<!-- always needed -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.1.3</version>
</dependency>
<!-- always needed -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.1.3</version>
</dependency>
<!-- only needed for forms -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>forms</artifactId>
<version>7.1.3</version>
</dependency>
<!-- only needed for PDF/A -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdfa</artifactId>
<version>7.1.3</version>
</dependency>
<!-- only needed for digital signatures -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>sign</artifactId>
<version>7.1.3</version>
</dependency>
<!-- only needed for barcodes -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>barcodes</artifactId>
<version>7.1.3</version>
</dependency>
<!-- only needed for Asian fonts -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.1.3</version>
</dependency>
先把相关pdf模板文件填写好表单域。把要写入内容的地方做好标记。
相关代码
import com.aliyun.boss.api.domain.biz.PDFModel;
import com.aliyun.boss.api.domain.biz.PDFProductItem;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class MyPdf2 {
public static void main(String[] args) throws Exception{
//removePage("D:\\tst\\111.pdf","D:\\tst\\temp.pdf");
PDFModel model = new PDFModel();
model.setAuthCode("code_201923232");
model.setCustomerName("北京那啥一个有限公司的公司");
model.setFoundationName("阿里云计算有限公司授权用户使用"+"这几一个基座名称abc");
model.setProjectName("项目名称有没有名");
List<PDFProductItem> prods = new ArrayList<PDFProductItem>();
for (int i = 0 ; i<20;i++){
PDFProductItem prod = new PDFProductItem();
prod.setCount(""+i);
prod.setDeadLine("永久有效");
prod.setSofName("流计算Stream sofName"+i);
prod.setProdName("分布式关系型数据库服务prodName" +i);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
String starttime = sdf.format(new Date());
String endtime = sdf.format(new Date().getTime()+1000);
String deadLine = starttime+"至"+endtime;
prod.setDeadLine(deadLine);
prods.add(prod);
}
model.setProds(prods);
//第一个参数是模板文件所在位置,第二个参数是临时文件,不能和第一个参数重名,第三个参数是输出流
fillTemp("D:\\tst\\temp.pdf","D:\\tst\\tmp.pdf",new FileOutputStream("D:\\out.pdf"),model);
}
//删除第几页,从1开始。
public static void removePage(String src,String dest) throws Exception{
//Initialize PDF document
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
pdfDoc.removePage(1);
//pdfDoc.removePage(2);
pdfDoc.close();
}
@SuppressWarnings("deprecation")
public static void fillTemp(String src, String tmp,OutputStream out, PDFModel model)
throws Exception{
//PdfFont font = PdfFontFactory.createFont("/Users/zhangjiajia/Downloads/NotoSansCJK-Regular.ttc",PdfEncodings.IDENTITY_H, false);
int pageSize = 15;//每页15条记录
int total = model.getProds().size();
int page = total%pageSize==0?total/pageSize:((total/pageSize)+1);//分页
System.out.println(page);
PdfDocument dPdf = new PdfDocument(new PdfWriter(out));
// 填充当前页面.
for (int i = 0;i<page;i++){
PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", false);
PdfDocument sPdf = new PdfDocument(new PdfReader(src),new PdfWriter(tmp));
PdfAcroForm form = PdfAcroForm.getAcroForm(sPdf, false);
Map<String, PdfFormField> fields = form.getFormFields();
//设置字体,大小,无边框
//fields.get("foundationName").setValue(model.getFoundationName(),font,8).setBorderWidth(0);
fields.get("customerName").setValue(model.getCustomerName(),font,8);
fields.get("projectName").setValue(model.getProjectName(),font,8).setBorderWidth(0);
fields.get("authCode").setValue(model.getProjectName(),font,8).setBorderWidth(0);
fields.get("page").setValue(""+(i+1),font,10).setBorderWidth(0);
fields.get("total").setValue(""+page,font,10).setBorderWidth(0);
int start = (i)*pageSize;
for (int j = start;(j<(start + pageSize)) && (j < model.getProds().size());j++){
String sofName = "sofName";
String prodName = "prodName";
String count = "count";
String deadLine = "deadLine";
fields.get(sofName+(j%pageSize)).setValue(model.getProds().get(j).getSofName(),font,8).setBorderWidth(0);
fields.get(prodName+(j%pageSize)).setValue(model.getProds().get(j).getProdName(),font,8).setBorderWidth(0);
fields.get(count+(j%pageSize)).setValue(model.getProds().get(j).getCount(),font,8).setBorderWidth(0);
fields.get(deadLine+(j%pageSize)).setValue(model.getProds().get(j).getDeadLine(),font,6).setBorderWidth(0);
}
form.flattenFields();
sPdf.close();
PdfDocument tmpPdf = new PdfDocument(new PdfReader(tmp));
tmpPdf.copyPagesTo(1,1,dPdf);
tmpPdf.close();
}
dPdf.close();
}
}
**
正式上线后的要修改的代码
**
@SuppressWarnings("deprecation")
public static void fillSoftTemp(String src,OutputStream out, PDFModel model)
throws Exception{//删除临时文件的地址,直接在内存中生成
int pageSize = 15;
int total = model.getProds().size();
int page = total%pageSize==0?total/pageSize:((total/pageSize)+1);
System.out.println(page);
PdfDocument dPdf = new PdfDocument(new PdfWriter(out));
// 填充当前页面.
for (int i = 0;i<page;i++){
ByteArrayOutputStream bos = new ByteArrayOutputStream();//新建对象
PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", false);
PdfDocument sPdf = new PdfDocument(new PdfReader(src),new PdfWriter(bos));
PdfAcroForm form = PdfAcroForm.getAcroForm(sPdf, false);
Map<String, PdfFormField> fields = form.getFormFields();
fields.get("foundationName").setValue(model.getFoundationName(),font,8).setBorderWidth(0);
fields.get("customerName").setValue(model.getCustomerName(),font,8).setBorderWidth(0);
fields.get("projectName").setValue(model.getProjectName(),font,8).setBorderWidth(0);
fields.get("authCode").setValue(model.getProjectName(),font,8).setBorderWidth(0);
fields.get("page").setValue(""+(i+1),font,10).setBorderWidth(0);
fields.get("total").setValue(""+page,font,10).setBorderWidth(0);
int start = (i)*pageSize;
for (int j = start;(j<(start + pageSize)) && (j < model.getProds().size());j++){
String sofName = "sofName";
String prodName = "prodName";
String count = "count";
String deadLine = "deadLine";
fields.get(sofName+(j%pageSize)).setValue(model.getProds().get(j).getSofName(),font,8).setBorderWidth(0);
fields.get(prodName+(j%pageSize)).setValue(model.getProds().get(j).getProdName(),font,8).setBorderWidth(0);
fields.get(count+(j%pageSize)).setValue(model.getProds().get(j).getCount(),font,8).setBorderWidth(0);
fields.get(deadLine+(j%pageSize)).setValue(model.getProds().get(j).getDeadLine(),font,8).setBorderWidth(0);
}
form.flattenFields();
sPdf.close();
bos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());//此处新建对象
PdfDocument tmpPdf = new PdfDocument(new PdfReader(bis));
tmpPdf.copyPagesTo(1,1,dPdf);
tmpPdf.close();
}
dPdf.close();
out.close();
}