ItextPdf使⽤模版制作pdf
最近在做⼀个项⽬,需求是要能够根据数据库⾥的信息分析并⽣成pdf。
因为我们项⽬组对于产出的pdf的设计是有严格规划的。
这个pdf⼀共6页,每⼀页都有不同的设计以及内容需求。⽽此前在⽹上所寻者,甚少有涉及对于不同页⾯、不同的模版的输出案例。在
这篇博客中,我会提供我的解决⽅案代码以及思路,等等。
@Override
演员刘敏涛丈夫虹猫仗剑走天涯主题曲public MessageResponse pdfmaker(aid id) throws IOException {
long aid = 0;
aid = id.getAid().longValue();
Answers answer = getByAid(aid);
搬迁补偿long cid = Cid().longValue();
Customer customer = ById(cid);
Value value = value(answer);苍井空胸围
diagramMaker(answer,value);
String tPath[] = new String[6];//这⾥的思路是,⼀般只有⼀个模版的情况下,指向的地址只有⼀个,这⾥扩充了地址数量,将⼀个字符串改为字符串数组,然后进⾏循 tPath[0]="D:/Users/m1.pdf";//这⾥导⼊模版地址
tPath[1]="D:/Users/m2.pdf";
tPath[2]="D:/Users/m3.pdf";
tPath[3]="D:/Users/m4.pdf";
tPath[4]="D:/Users/m5.pdf";
tPath[5]="D:/Users/m6.pdf";
String newPDFPath = "D:/Users/Report"+aid+".pdf";//⽣成地址
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos[]= new ByteArrayOutputStream[6];
PdfStamper stamper;
try {
out = new FileOutputStream(newPDFPath);
for(int i =0;i<6;i++)
{
// 输出流
reader = new PdfReader(tPath[i]);// load the pdf models
bos[i] = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos[i]);
AcroFields form = AcroFields();
if(i==0)
{
form.setField("companyName", CompanyName());
form.setField("contactName",ContactName());
与月亮有关的神话传说form.setField("contactJobTitle",ContactJobTitle());
form.setField("contactEmail", ContactEmail());
form.setField("contactTel",ContactTel());
form.setField("numOfEmployees",NumOfEmployee());
form.setField("companyLocation",CompanyLocation());
form.setField("businessSector",BusinessSector());
}
if(i==1)
{
//line chart 1
String imagePath1 = "D:/Users/Linechart1"+aid+".jpeg";
String fieldName1 = "chart1";
int pageNo1 = FieldPositions(fieldName1).get(0).page;
Rectangle signRect1 = FieldPositions(fieldName1).get(0).position;
float x1 = Left();
float y1 = Bottom();
float y1 = Bottom();
Image image1 = Instance(imagePath1);
PdfContentByte under1 = OverContent(pageNo1);
image1.Width(), Height());
image1.setAbsolutePosition(x1, y1);
under1.addImage(image1);
//line chart 2
String imagePath2 = "D:/Users/Linechart2"+aid+".jpeg";
String fieldName2 = "chart2";
Rectangle signRect2 = FieldPositions(fieldName2).get(0).position;
float x2 = Left();
float y2= Bottom();
Image image2 = Instance(imagePath2);
PdfContentByte under2 = OverContent(pageNo1);
image2.Width(), Height());
image2.setAbsolutePosition(x2, y2);
under2.addImage(image2);
//line chart 3
String imagePath3 = "D:/Users/Linechart3"+aid+".jpeg";
String fieldName3 = "chart3";
Rectangle signRect3 = FieldPositions(fieldName3).get(0).position;
float x3 = Left();
float y3 = Bottom();
Image image3 = Instance(imagePath3);
PdfContentByte under3 = OverContent(pageNo1);
image3.Width(), Height());
image3.setAbsolutePosition(x3, y3);
under3.addImage(image3);
form.setField("t1Q1",T1Q1());
form.setField("t1Q2",T1Q2());
form.setField("t1Q3",T1Q3());
form.setField("t1Q4",T1Q4());
form.setField("t2Q1",T2Q1());
form.setField("t2Q2",T2Q2());
form.setField("t2Q3",T2Q3());
form.setField("t2Q4",T2Q4());
form.setField("t3Q1",T3Q1());
form.setField("t3Q2",T3Q2());
form.setField("t3Q3",T3Q3());
form.setField("t3Q4",T3Q4());
form.setField("t3Q5",T3Q5());
/*这部分代码为导⼊数据并拼接⼊模版的过程,因为后⾯⼏页的内容⽅法⼤同⼩异,故后⾯的为节省篇幅会省略*/ }
if(i==2)
{
}
if(i==3)
{
}
if(i==4)
{
}
if(i==5)
{
}
stamper.setFormFlattening(true);//让⽣成的pdf不能再次修改 stamper.close();
}
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
for(int i =0; i<6;i++)//加这个循环是为了组合不同模版所⽣成的不同页⾯。
{
PdfImportedPage importPage = ImportedPage(new PdfReader(bos[i].toByteArray()), 1);
copy.addPage(importPage);
}
doc.close();
}
catch (IOException e)
{
System.out.println(e);
return new MessageResponse(MsgEnum.FAIL);
}
catch (DocumentException e)
灵魂碎片{
System.out.println(e);
return new MessageResponse(MsgEnum.DOCUMENT_FAIL);
}
return new MessageResponse(MsgEnum.SUCCESS);
}
有关如何制作itextpdf模版,使⽤adobe acrobat即可。具体制作教程可在CSDN中⾃⾏查,这⾥就不赘述了。本⼈学习时间较短,⽔平有限,如有未尽事宜或者错误纰漏,欢迎评论区/私信交流讨论或批评指正,感谢!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论