前言:以前出过两期用itext填充pdf的文章,有人说那个会那字体加入到pdf中,导致pdf占用内存过大,那么今天就来分享一期另外的方法。
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
import cn.hutool.core.date.DateUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
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);
//这个是生成破pdf的位置以及名称
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);
//上面是基础的字体,代表使用哪一种字体,下面设置的是字体的字号,粗细等等属性
//使用上面的title 字体 加粗,这个是标题字体
Font titleFont = new Font(title, 22, Font.BOLD);
//使用字体,正文字体
Font font = new Font(bf, 16);
// 这个是我们动态填充的字体,Font.UNDERLINE带下划线的
Font underlineFont = new Font(bf, 16, Font.UNDERLINE);
// -------------------设置 二维码图片 ----------------
// 加入水印
waterMar = pdfWriter.getDirectContentUnder();
// 开始设置水印图片
waterMar.beginText();
ByteArrayOutputStream out = new ByteArrayOutputStream();
//QrCodeUtils.createQrCodeBufferdImage这个方法就是将网址变成二维码图片
ImageIO.write(QrCodeUtils.createQrCodeBufferdImage("https://www.baidu.com",
100, 100), "png", out);
byte[] b = out.toByteArray();
Image itextimage = Image.getInstance(b);
// 水印图片位置 第一个参数为x轴,第二个参数为y轴
itextimage.setAbsolutePosition(120, 410);
// 附件加上水印图片
waterMar.addImage(itextimage);
//结束设置
waterMar.endText();
waterMar.stroke();
// -------------------设置 段落 ----------------
//这里面可以设置段落和短语(块),如果是那种固定文字的段落就可以用段落
//如果我们需要生成的段落里有需要动态填充的就用块,一点一点的拼起来,直到达到我们的效果
//段落
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("哈哈哈哈哈哈哈", font));
ph.add(new Chunk("2022" + " ", underlineFont));//年份
ph.add(new Chunk("第", font));
ph.add(new Chunk("100" + " ", underlineFont));// 号数
ph.add(new Chunk("号", font));
p.add(ph);
p.setSpacingBefore(20);//段落与段落的间距,我们一个ph就组成一个段落
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);
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);
document.add(p);
document.close();
pdfWriter.close();
System.out.println("创建成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
怎么样,是不是超级简单呢,只需要简单的调试,就可以达到我们所需要的效果,简直yyds。