前几期分析了怎么用itext生成pdf,有兴趣的可以去看看。
1,java使用itext生成pdf,超简单教学,有手就行
2,java使用itext填充pdf模板,超简单教学,有手就行
然后现在有了新的需求,需要将某个段落固定在pdf的某个位置。因为文中的一些字段不是固定的,所以文章长度是不确定的,我们右下角这个就会根据文章的长度上下移动,导致一些后续的东西不能开展,所以就提出了固定的需求。
话不多说,开整
在这里我们需要用得到是Rectangle 属性。先看下面的代码了解一下这个属性。
//文档对象 实现A4纸页面
Document document = new Document(PageSize.A4);
//document.setMarginMirroring(true);
//设置文档的页边距
document.setMargins(80,80,20,10);
String fileName = "C:\\Users\\admin\\Desktop\\"+System.currentTimeMillis()+".pdf";
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(fileName));p = new Paragraph();
ph = new Phrase();
ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈13", font));
p.add(ph);
p.setSpacingBefore(5);
p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式
p.setLeading(30);Rectangle rects = new Rectangle(330, 120, 500, 160);//文本框位置
rects.setBorder(Rectangle.BOX);//显示边框,默认不显示,常量值:LEFT, RIGHT, TOP, BOTTOM,BOX,
rects.setBorderWidth(1f);//边框线条粗细
rect.setBorderColor(BaseColor.GREEN);//边框颜色
rects.setBackgroundColor(BaseColor.GRAY);//背景颜色
pdfWriter.getDirectContent().rectangle(rects);
ColumnText ct = new ColumnText(pdfWriter.getDirectContent());
ct.addElement(p);
ct.setSimpleColumn(rects);
ct.go();
看看效果:
其实整个代码都很好理解,直接拿去就能用,最难的就是
Rectangle rects = new Rectangle(330, 120, 500, 160);//文本框位置
这个就是决定他固定的位置的代码。一共分为4个坐标,前两个代表一个点,后两个代表一个点,坐标轴的原点(0,0)位于该页面的左下角,Itext 将以这两个点作为对角点来创建一个矩形。
大概就是这个意思,大家明白了这个的意思,就可以愉快的来固定了。
代码中的边框,背景色,只是演示用得,大家不用的话就直接把相对应的属性删掉就行了。
最后上个完整的代码。
package com.licence;import cn.hutool.core.date.DateUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;import javax.imageio.ImageIO;
import java.io.*;public class Demo2 {public static void main(String[] args) {Demo2.pdf();}public static void pdf() {PdfContentByte waterMar;try {//文档对象 实现A4纸页面Document document = new Document(PageSize.A4);//document.setMarginMirroring(true);//设置文档的页边距document.setMargins(70, 70, 20, 10);String fileName = "C:\\Users\\汇美\\Desktop\\" + System.currentTimeMillis() + ".pdf";PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(fileName));//打开文档document.open();// 加载字体//创建标题字体BaseFont title = BaseFont.createFont("c://windows//fonts//simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//创建正文字体BaseFont bf = BaseFont.createFont("c://windows//fonts//simfang.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);Font titleFont = new Font(title, 22, Font.BOLD);//使用字体 加粗Font font = new Font(bf, 16);//使用字体Font underlineFont = new Font(bf, 16, Font.UNDERLINE); // 下划线// -------------------设置 段落 ----------------//段落Paragraph p = null;p = new Paragraph("呵呵哈哈哈或或", titleFont);p.setLeading(30);p.setAlignment(Element.ALIGN_CENTER);//设置对齐方式document.add(p);p = new Paragraph("红红火火恍恍惚惚", titleFont);p.setLeading(30);p.setAlignment(Element.ALIGN_CENTER);//设置对齐方式document.add(p);p = new Paragraph();//短语Phrase ph = new Phrase();//块ph.add(new Chunk("2022 第008 号", font));p.add(ph);p.setSpacingBefore(20);//段落与段落的间距p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式p.setLeading(20);//行间距document.add(p);p = new Paragraph();ph = new Phrase();ph.add(new Chunk("呵呵哈哈哈:", underlineFont));//机构名称p.add(ph);//设置和上行的间隔p.setSpacingBefore(10);//p.setLeading(20);document.add(p);p = new Paragraph();ph = new Phrase();ph.add(new Chunk(" 哈哈哈哈哈哈哈", font));ph.add(new Chunk("哈哈哈哈哈哈哈1", underlineFont));//项目名称ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈2", font));ph.add(new Chunk("哈哈哈哈哈哈哈3", underlineFont));//医院名称ph.add(new Chunk("哈哈哈哈哈哈哈4", font));ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈5", underlineFont));//建设项目名称ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈6", font));ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈7", underlineFont));//号ph.add(new Chunk("哈哈哈哈哈哈哈8", font));//ph.setMultipliedLeading(20);p.add(ph);p.setSpacingBefore(5);p.setLeading(30);document.add(p);p = new Paragraph();ph = new Phrase();ph.add(new Chunk(" 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈9", font));ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈10", underlineFont));//项目名称ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈11", font));p.add(ph);p.setSpacingBefore(5);p.setLeading(30);document.add(p);p = new Paragraph();ph = new Phrase();ph.add(new Chunk(" 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈12。", font));p.add(ph);p.setSpacingBefore(5);p.setLeading(30);document.add(p);p = new Paragraph();ph = new Phrase();ph.add(new Chunk(" 此复", font));p.add(ph);p.setSpacingBefore(5);p.setLeading(30);document.add(p);p = new Paragraph();ph = new Phrase();ph.add(new Chunk("哈哈哈哈哈哈哈哈哈13", font));p.add(ph);p.setSpacingBefore(5);p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式p.setLeading(30);Rectangle rects = new Rectangle(330, 120, 500, 160);//文本框位置rects.setBorder(Rectangle.BOX);//显示边框,默认不显示,常量值:LEFT, RIGHT, TOP, BOTTOM,BOX,rects.setBorderWidth(1f);//边框线条粗细rects.setBorderColor(BaseColor.GREEN);//边框颜色rects.setBackgroundColor(BaseColor.GRAY);//背景颜色pdfWriter.getDirectContent().rectangle(rects);ColumnText ct = new ColumnText(pdfWriter.getDirectContent());ct.addElement(p);ct.setSimpleColumn(rects);ct.go();//document.add(p);p = new Paragraph();ph = new Phrase();String date = DateUtil.now();ph.add(new Chunk(date.substring(0, 4) + " ", underlineFont));//年ph.add(new Chunk("年", font));ph.add(new Chunk(date.substring(5, 7) + " ", underlineFont));//月ph.add(new Chunk("月", font));ph.add(new Chunk(date.substring(8, 10) + " ", underlineFont));//日ph.add(new Chunk("日", font));p.add(ph);p.setSpacingBefore(5);p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式p.setLeading(30);rects = new Rectangle(340, 80, 500, 120);//文本框位置rects.setBorder(Rectangle.BOX);//显示边框,默认不显示,常量值:LEFT, RIGHT, TOP, BOTTOM,BOX,rects.setBorderWidth(1f);//边框线条粗细rects.setBorderColor(BaseColor.GREEN);//边框颜色rects.setBackgroundColor(BaseColor.GRAY);//背景颜色//rect.setBorderColor(BaseColor.GREEN);//边框颜色pdfWriter.getDirectContent().rectangle(rects);ct = new ColumnText(pdfWriter.getDirectContent());ct.addElement(p);ct.setSimpleColumn(rects);ct.go();//document.add(p);document.close();pdfWriter.close();System.out.println("创建成功!");} catch (Exception e) {e.printStackTrace();}}
}