前言:以前出过两期用itext填充pdf的文章,有人说那个会那字体加入到pdf中,导致pdf占用内存过大,那么今天就来分享一期另外的方法。
java使用itext生成pdf
- 1、导包
- 2、直接贴代码,然后大家看注释
- 3、效果
1、导包
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version>
</dependency>
2、直接贴代码,然后大家看注释
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();}}
}
3、效果
怎么样,是不是超级简单呢,只需要简单的调试,就可以达到我们所需要的效果,简直yyds。