Java使用itext 生成PDF,以生成个人简历为例

2023-11-08

在日常的应用中经常会有需求,生成pdf或者word文档,常见的第三方工具有Apache的poi,以及itext等等,这里使用itext生成pdf,以个人简历作为示例,了解itextde 使用。

第0步:效果:

第一步:引入依赖包:

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.1</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>font-asian</artifactId>
    <version>7.1.9</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.1.9</version>
</dependency>

第二步:首先要创建文档Document,以及设置文档属性,如设置为A4纸等等,然后设置文档的保存路径,接下来就是开始编写文档的元素了,如段落,表格、标题等等。

完整代码如下:

package net.hlinfo.utils;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class PdfDemo {
	private static final String splitVline = "    |    ";
	private static final String TAB = "    ";
	//判断是否为16进制颜色
        public static boolean isHexColor(String color) {
    	    String HEX_PATTERN = "[0-9A-Fa-f]+";
            return color != null && color.length() == 6 && color.matches(HEX_PATTERN);
        }
        //将16进制颜色转换为Color对象
	private static BaseColor myColor(String hexColor) {
		hexColor = hexColor.replace("#", "");
		if(hexColor.length()==3) {
			hexColor = hexColor+hexColor;
		}
		if(!isHexColor(hexColor)) {
			hexColor = "ffffff";
		}
		int r= Integer.valueOf( hexColor.substring( 0, 2 ), 16 );
		int g= Integer.valueOf( hexColor.substring( 2, 4 ), 16 );
		int b= Integer.valueOf( hexColor.substring( 4, 6 ), 16 );
		return new BaseColor(r,g,b);
	}
	/**
	 * 设置字体,及大小
	 * @param size
	 * @param style
	 * @return
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font myfont(float size,int style) throws DocumentException, IOException {
		   BaseFont bfChinese = BaseFont.createFont("/home/syst.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
         com.itextpdf.text.Font myFont = new com.itextpdf.text.Font(bfChinese, size, style);
         return myFont;
	}
	private static Font myfont(float size,int style,String color) throws DocumentException, IOException {
		BaseFont bfChinese = BaseFont.createFont("/home/syst.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
      com.itextpdf.text.Font myFont = new com.itextpdf.text.Font(bfChinese, size, style);
      myFont.setColor(myColor(color));
      return myFont;
	}
	/**
	 * 标题一
	 * @param text
	 * @return
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Paragraph h1(String text) throws DocumentException, IOException {
		Paragraph p = new Paragraph(text,myfont(16,Font.BOLD));
		//p.setSpacingBefore(30f);
		return p;
	}
	/**
	 * 带前导图的标题
	 * @param text 标题文字
	 * @return
	 * @throws Exception
	 */
	private static PdfPTable add_headtitle_1(String text) throws Exception{
		PdfPTable table = new PdfPTable(2);
		// 实现单元格跨页显示
		table.setSplitLate(false);
		table.setSplitRows(true);
        //设置每列宽度比例   
        int width_ht1[] = {2,98};
        table.setWidths(width_ht1); 
        table.getDefaultCell().setBorder(0);
          //带前导图(方法1)地址
        //String imagePath2 = "/home/hadoop/Pictures/line.png"; //图片为2px*11px
        //Image image21 = Image.getInstance(imagePath2); 
         //带前导图(方法2)用Java画
        BufferedImage image = new BufferedImage(2, 11,BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(new Color(83, 202, 195)); // #53cac3
        g.fillRect(0, 0, 2, 11);
        Image image21 = Image.getInstance(image,null);
          
        PdfPCell cellHt1img=new PdfPCell();
        cellHt1img.setBorder(0);
        cellHt1img.setImage(image21);
        cellHt1img.setFixedHeight(1);
        cellHt1img.setPaddingTop(5);
        PdfPCell cellHt1Content = new PdfPCell(h1(text));
        cellHt1Content.setBorder(0);
        //cell21.setLeading(5, 1);
        table.addCell(cellHt1img);
        table.addCell(cellHt1Content); 
        return table;
	}
	/**
	 * 空行
	 * @return
	 * @throws Exception
	 */
	private static Paragraph blankRow() throws Exception{
		Paragraph blankRow = new Paragraph(20f, " ", myfont(20,Font.BOLD)); 
		return blankRow;
	}
	/**
	 * 空行
	 * @param leading 行间距
	 * @return
	 * @throws Exception
	 */
	private static Paragraph blankRow(float leading) throws Exception{
		Paragraph blankRow = new Paragraph(leading, " ", myfont(20,Font.BOLD)); 
		return blankRow;
	}
	private static PdfPCell add_cell(Object obj,float lead) throws Exception{
		PdfPCell cell = new PdfPCell(new Paragraph(obj+"",myfont(12,Font.NORMAL)));
		cell.setBorder(0);
		cell.setLeading(lead, 1);
		return cell;
	}
	private static PdfPCell add_cell(Object obj,String color,float lead) throws Exception{
		color = color==null?"#000000":color;
		PdfPCell cell = new PdfPCell(new Paragraph(obj+"",myfont(12,Font.NORMAL,color)));
		cell.setBorder(0);
		cell.setLeading(lead, 1);
		return cell;
	}
	private static PdfPCell add_cell(Object obj,TBCell tbCell) throws Exception{
		PdfPCell cell = new PdfPCell(new Paragraph(obj+"",myfont(tbCell.getFontSize(),tbCell.getFontStyle(),tbCell.getTextColor())));
		cell.setBorder(tbCell.getBorder());
		cell.setLeading(tbCell.getLead(), 1);
		if(tbCell.getBgcolor()!=null && !"".equals(tbCell.getBgcolor())) {
			cell.setBackgroundColor(myColor(tbCell.getBgcolor()));
		}
		if(tbCell.getColspan()!=0) {
			cell.setColspan(tbCell.getColspan());
		}
		if(tbCell.getRowspan()!=0) {
			cell.setRowspan(tbCell.getRowspan());
		}
		if(tbCell.getBorderColor()!=null && !"".equals(tbCell.getBorderColor())) {
			cell.setBorderColor(myColor(tbCell.getBorderColor()));
		}
		if(tbCell.getIndent()>0) {
			cell.setIndent(tbCell.getIndent());
		}
		return cell;
	}
	private static PdfPCell add_cell_speace(TBCell tbCell) throws Exception{
		PdfPCell cell = new PdfPCell(new Paragraph(" ",myfont(tbCell.getFontSize(),tbCell.getFontStyle(),tbCell.getTextColor())));
		cell.setBorder(tbCell.getBorder());
		cell.setLeading(tbCell.getLead(), 1);
		if(tbCell.getBgcolor()!=null && !"".equals(tbCell.getBgcolor())) {
			cell.setBackgroundColor(myColor(tbCell.getBgcolor()));
		}
		if(tbCell.getColspan()!=0) {
			cell.setColspan(tbCell.getColspan());
		}
		if(tbCell.getRowspan()!=0) {
			cell.setRowspan(tbCell.getRowspan());
		}
		if(tbCell.getBorderColor()!=null && !"".equals(tbCell.getBorderColor())) {
			cell.setBorderColor(myColor(tbCell.getBorderColor()));
		}
		if(tbCell.getIndent()>0) {
			cell.setIndent(tbCell.getIndent());
		}
		return cell;
	}
	/**
	 * 工作经验主体方法
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_workExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		// 实现单元格跨页显示
		workExpTable.setSplitLate(false);
		workExpTable.setSplitRows(true);
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs1= TBCell.NEW().bgcolor("#eee").lead(5).borderColor("#eee").fontStyle(Font.BOLD);
		TBCell tbcs2= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).fontStyle(Font.BOLD);
		TBCell tbcs3= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1);
		TBCell tbcs4= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).indent(20);
		TBCell tbcs5= TBCell.NEW().bgcolor("#eee").lead(1).borderColor("#eee").colspan(2).rowspan(1);
		workExpTable.addCell(add_cell("贵州大数据发展集团", tbcs1));
		StringBuffer sbf = new StringBuffer();
		sbf.append("2019年10月-2020年10月");
		sbf.append(splitVline);
		sbf.append("项目经理");
		sbf.append(splitVline);
		sbf.append("10k~15k");
		sbf.append(splitVline);
		sbf.append("互联网产品经理");
		sbf.append(splitVline);
		sbf.append("计算机科学与技术");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs4));
		workExpTable.addCell(add_cell("工作描述:",tbcs2));
		StringBuffer sbd = new StringBuffer();
		sbd.append("在公司参与营销中心财务系统的设计与开发。\n" + 
				"系统基于spring cloud的微服务平台,前端是使用vue框架,后台使用spring cloud与Mybatis,前后台使用json数据交换。还使用了mysql分布式数据库,Oracle数据库以及redis集群,\n" + 
				"系统使用docker容器部署。使用git代码管理,maven构建系统,devops自动化部署");
		workExpTable.addCell(add_cell(sbd.toString(),tbcs4));
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
	/**
	 * 项目经验主体
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_projectExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		// 实现单元格跨页显示
		workExpTable.setSplitLate(false);
		workExpTable.setSplitRows(true);
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs1= TBCell.NEW().bgcolor("#eee").lead(5).borderColor("#eee").fontStyle(Font.BOLD);
		TBCell tbcs2= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).fontStyle(Font.BOLD);
		TBCell tbcs3= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1);
		TBCell tbcs4= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).indent(20);
		TBCell tbcs5= TBCell.NEW().bgcolor("#eee").lead(1).borderColor("#eee").colspan(2).rowspan(1);
		workExpTable.addCell(add_cell("基于人工智能的智慧校园平台", tbcs1));
		StringBuffer sbf = new StringBuffer();
		sbf.append("项目时间:2019年11月11日0点-2019年11月20日24点");
		sbf.append(splitVline);
		sbf.append("担任角色:项目经理");
		sbf.append(splitVline);
		sbf.append("所属单位:贵州大数据研究所");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs3));
		workExpTable.addCell(add_cell("项目描述:",tbcs2));
		StringBuffer sbd = new StringBuffer();
		sbd.append("在公司参与营销中心财务系统的设计与开发。\n" + 
				"系统基于spring cloud的微服务平台,前端是使用vue框架,后台使用spring cloud与Mybatis,前后台使用json数据交换。还使用了mysql分布式数据库,Oracle数据库以及redis集群,\n" + 
				"系统使用docker容器部署。使用git代码管理,maven构建系统,devops自动化部署");
		workExpTable.addCell(add_cell(sbd.toString(),tbcs4));
		workExpTable.addCell(add_cell("个人职责:",tbcs2));
		StringBuffer sbgr = new StringBuffer();
		sbgr.append("在公司参与营销中心财务系统的设计与开发。\n" + 
				"系统基于spring cloud的微服务平台,前端是使用vue框架,后台使用spring cloud与Mybatis,前后台使用json数据交换。还使用了mysql分布式数据库,Oracle数据库以及redis集群,\n" + 
				"系统使用docker容器部署。使用git代码管理,maven构建系统,devops自动化部署");
		workExpTable.addCell(add_cell(sbgr.toString(),tbcs4));
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
	/**
	 * 教育经历
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_eduExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		// 实现单元格跨页显示
		workExpTable.setSplitLate(false);
		workExpTable.setSplitRows(true);
		
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs1= TBCell.NEW().bgcolor("#eee").lead(5).borderColor("#eee").fontStyle(Font.BOLD);
		TBCell tbcs2= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).fontStyle(Font.BOLD);
		TBCell tbcs3= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1);
		TBCell tbcs4= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).indent(20);
		TBCell tbcs5= TBCell.NEW().bgcolor("#eee").lead(1).borderColor("#eee").colspan(2).rowspan(1);
		workExpTable.addCell(add_cell("贵州教育大学", tbcs1));
		StringBuffer sbf = new StringBuffer();
		sbf.append("专业:计算机科学与技术");
		sbf.append(splitVline);
		sbf.append("学历:本科");
		sbf.append(splitVline);
		sbf.append("时间:2015年9月-2019年7月");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs3));
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
	/**
	 * 培训经历
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_trainExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		// 实现单元格跨页显示
		workExpTable.setSplitLate(false);
		workExpTable.setSplitRows(true);
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs1= TBCell.NEW().bgcolor("#eee").lead(5).borderColor("#eee").fontStyle(Font.BOLD);
		TBCell tbcs2= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).fontStyle(Font.BOLD);
		TBCell tbcs3= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1);
		TBCell tbcs4= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1).indent(20);
		TBCell tbcs5= TBCell.NEW().bgcolor("#eee").lead(1).borderColor("#eee").colspan(2).rowspan(1);
		workExpTable.addCell(add_cell("培训课程:hadoop高级工程师培训", tbcs1));
		StringBuffer sbf = new StringBuffer();
		sbf.append("时间:2015年9月-2019年7月");
		sbf.append(splitVline);
		sbf.append("培训机构:大数据培训中心");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs3));
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
	/**
	 * 专业技能
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_majorSkillExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		//配置单元格跨页显示
		workExpTable.setSplitLate(false);
		workExpTable.setSplitRows(true);
		
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs3= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1);
		TBCell tbcs5= TBCell.NEW().bgcolor("#eee").lead(1).borderColor("#eee").colspan(2).rowspan(1);
		StringBuffer sbf = new StringBuffer();
		sbf.append("Linux");
		sbf.append(splitVline);
		sbf.append("5年");
		sbf.append(splitVline);
		sbf.append("熟练");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs3));
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
	/**
	 * 语言能力
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_langSkillExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		//配置单元格跨页显示
		workExpTable.setSplitLate(false);
		workExpTable.setSplitRows(true);
		
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs3= TBCell.NEW().bgcolor("#eee").lead(10).borderColor("#eee").colspan(2).rowspan(1);
		TBCell tbcs5= TBCell.NEW().bgcolor("#eee").lead(1).borderColor("#eee").colspan(2).rowspan(1);
		StringBuffer sbf = new StringBuffer();
		sbf.append("英语");
		sbf.append(splitVline);
		sbf.append("听说能力:熟练");
		sbf.append(splitVline);
		sbf.append("读写能力:熟练");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs3));
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
	/**
	 * 资格证书 
	 * @param doc Document对象
	 * @throws Exception
	 */
	private static void add_certExpTable(Document doc) throws Exception{
		PdfPTable workExpTable = new PdfPTable(1);
		int workExpTableWidth[] = {100};
		workExpTable.setWidths(workExpTableWidth);
		workExpTable.getDefaultCell().setBorder(0);
		TBCell tbcs3= TBCell.NEW().lead(10).colspan(2).rowspan(1);
		TBCell tbcs5= TBCell.NEW().lead(1).colspan(2).rowspan(1);
		StringBuffer sbf = new StringBuffer();
		sbf.append("证书名称: HCIP华为认证ICT高级工程师");
		sbf.append(splitVline);
		sbf.append("获得时间:2019年10月");
		workExpTable.addCell(add_cell(sbf.toString(),tbcs3));
		//String certImgPath = "http://www.ynbdqn.cn/DianNaoPeiXun/UploadFiles_7627/201011/2010111610590444.jpg";
		String certImgPath = "/home/hadoop/Pictures/cert.jpeg";
		Image certImg = Image.getInstance(certImgPath); 
		//设置图片缩放(让超过文档宽度的图片自适应宽度)
		float imgWidth = certImg.getScaledWidth();
		BigDecimal bdiw = new BigDecimal("480").divide(new BigDecimal(imgWidth),2, RoundingMode.HALF_UP);
		BigDecimal bdrs = bdiw.multiply(new BigDecimal("100"));
		certImg.scalePercent(bdrs.floatValue());
		PdfPCell cellCert=new PdfPCell();
		cellCert.setBorder(0);
		cellCert.setImage(certImg);
		workExpTable.addCell(add_cell_speace(tbcs5));
		workExpTable.addCell(cellCert);
		workExpTable.addCell(add_cell_speace(tbcs5));
		doc.add(workExpTable);
		doc.add(blankRow(5));
	}
    public static void main(String[] args) {
    	try
    	{
                //创建文档
    		Document document = new Document(PageSize.A4,5, 5, 36, 36);
                //设置文档保存路径
    		PdfWriter.getInstance(document, new FileOutputStream("/home/demo.pdf"));
    		document.open();
    		Paragraph title = new Paragraph(18f, "个人简历", myfont(22,Font.BOLD));
			title.setAlignment(Element.ALIGN_CENTER);
			document.add(title);
			document.add(blankRow(30));
			//基本信息
			PdfPTable tbBaseInfo = new PdfPTable(2);
			PdfPCell cell11 = new PdfPCell(new Paragraph("林黛玉",myfont(18,Font.NORMAL)));
			cell11.setBorder(0);
			//cell11.setPaddingTop(5);
			cell11.setPaddingBottom(10);
			cell11.setPaddingLeft(15);
			//头像
			String headImgPath = "/home/hadoop/Pictures/lindaiyu.jpg";
			Image headImg = Image.getInstance(headImgPath); 
			//设置每列宽度比例   
			int width11[] = {15,85};
			tbBaseInfo.setWidths(width11); 
			tbBaseInfo.getDefaultCell().setBorder(0);
			PdfPCell cellHimg=new PdfPCell();
			cellHimg.setBorder(0);
			cellHimg.setImage(headImg);
			cellHimg.setColspan(1);//合并单元格
			cellHimg.setRowspan(3);
			tbBaseInfo.addCell(cellHimg);
			tbBaseInfo.addCell(cell11);
			PdfPCell cell12 = new PdfPCell(new Paragraph("女"+splitVline+"18岁"+splitVline+"大观园潇湘馆"+splitVline+"6年工作经验",myfont(12,Font.NORMAL)));
			cell12.setPaddingBottom(5);
			cell12.setPaddingLeft(15);
			cell12.setBorder(0);
			tbBaseInfo.addCell(cell12);
			PdfPCell cell13 = new PdfPCell(new Paragraph("15700000000"+splitVline+"lindaiyu@exapme.com",myfont(12,Font.NORMAL)));
			cell13.setBorder(0);
			cell13.setPaddingLeft(15);
			tbBaseInfo.addCell(cell13);
			document.add(tbBaseInfo);
            //加入空行
			document.add(blankRow(30));
				
			document.add(add_headtitle_1("求职意向"));
			//加入空行
			document.add(blankRow(5));
			//求职意向主体
			PdfPTable careerTable = new PdfPTable(4);
			//配置单元格跨页显示
			careerTable.setSplitLate(false);
			careerTable.setSplitRows(true);
			
			int careerTableWidth[] = {15,35,15,35};
			careerTable.setWidths(careerTableWidth); 
			careerTable.addCell(add_cell("求职状态:", "#878787",10));
			careerTable.addCell(add_cell("在职考虑换工作",10));
			careerTable.addCell(add_cell("工作地点:", "#878787",10));
			careerTable.addCell(add_cell("中国-义龙新区",10));
			
			careerTable.addCell(add_cell("期望行业:", "#878787",10));
			careerTable.addCell(add_cell("事业单位/计算机",10));
			careerTable.addCell(add_cell("期望职业:", "#878787",10));
			careerTable.addCell(add_cell("项目经理/运维开发/信息安全工程师/系统架构师",10));
			
			careerTable.addCell(add_cell("期望薪资:", "#878787",10));
			careerTable.addCell(add_cell("10k~15k",10));
			careerTable.addCell(add_cell("工作性质:", "#878787",10));
			careerTable.addCell(add_cell("全职",10));
			document.add(careerTable);
			//加入空行
			document.add(blankRow());
			
			//工作经验
			document.add(add_headtitle_1("工作经验"));
			document.add(blankRow(5));
			//工作经验 主体 Begin
			add_workExpTable(document);
			add_workExpTable(document);
			//工作经验 主体 END
			
			document.add(blankRow());
			
			//项目经验
			document.add(add_headtitle_1("项目经验"));
			document.add(blankRow(5));
			add_projectExpTable(document);
			
			document.add(blankRow());
			//教育经历
			document.add(add_headtitle_1("教育经历"));
			document.add(blankRow(5));
			add_eduExpTable(document);
			
			document.add(blankRow());
			//培训经历
			document.add(add_headtitle_1("培训经历"));
			document.add(blankRow(5));
			add_trainExpTable(document);
			
			document.add(blankRow());
			//专业技能
			document.add(add_headtitle_1("专业技能"));
			document.add(blankRow(5));
			add_majorSkillExpTable(document);
			
			document.add(blankRow());
			//语言能力
			document.add(add_headtitle_1("语言能力"));
			document.add(blankRow(5));
			add_langSkillExpTable(document);
			
			document.add(blankRow());
			//资格证书
			document.add(add_headtitle_1("资格证书 "));
			document.add(blankRow(5));
			add_certExpTable(document);
			
			document.close();
          System.out.println("创建成功");
    	} catch (Exception ex){
          ex.printStackTrace();
        }
    }
}

其中TBCell类用于链式设置文档元素的属性(如颜色、边框、字体大小等):

package net.hlinfo.utils;

import com.itextpdf.text.Font;

public class TBCell {
	private int border=0;
	private String textColor="#000000";
	private float lead=0;
	private float fontSize=12;
	private String bgcolor=null;
	private int colspan=0;
	private int rowspan=0;
	private String borderColor;
	private int fontStyle=Font.NORMAL;
	private float indent=0;
	public float getIndent() {
		return indent;
	}
	public void setIndent(float indent) {
		this.indent = indent;
	}
	public int getFontStyle() {
		return fontStyle;
	}
	public void setFontStyle(int fontStyle) {
		this.fontStyle = fontStyle;
	}
	public String getBorderColor() {
		return borderColor;
	}
	public void setBorderColor(String borderColor) {
		this.borderColor = borderColor;
	}
	public int getColspan() {
		return colspan;
	}
	public void setColspan(int colspan) {
		this.colspan = colspan;
	}
	public int getRowspan() {
		return rowspan;
	}
	public void setRowspan(int rowspan) {
		this.rowspan = rowspan;
	}
	public int getBorder() {
		return border;
	}
	public void setBorder(int border) {
		this.border = border;
	}
	public String getTextColor() {
		return textColor;
	}
	public void setTextColor(String textColor) {
		this.textColor = textColor;
	}
	public float getLead() {
		return lead;
	}
	public void setLead(float lead) {
		this.lead = lead;
	}
	public float getFontSize() {
		return fontSize;
	}
	public void setFontSize(float fontSize) {
		this.fontSize = fontSize;
	}
	public String getBgcolor() {
		return bgcolor;
	}
	public void setBgcolor(String bgcolor) {
		this.bgcolor = bgcolor;
	}
	
	public static TBCell NEW() {
        return new TBCell();
    }
	
	public TBCell border(int border) {
		this.setBorder(border);
		return this;
	}
	public TBCell color(String color) {
		this.setTextColor(color);
		return this;
	}
	public TBCell lead(float lead) {
		this.setLead(lead);
		return this;
	}
	public TBCell fontSize(float fontSize) {
		this.setFontSize(fontSize);
		return this;
	}
	public TBCell bgcolor(String bgcolor) {
		this.setBgcolor(bgcolor);
		return this;
	}
	public TBCell colspan(int colspan) {
		this.setColspan(colspan);
		return this;
	}
	public TBCell rowspan(int rowspan) {
		this.setRowspan(rowspan);
		return this;
	}
	public TBCell borderColor(String borderColor) {
		this.setBorderColor(borderColor);
		return this;
	}
	public TBCell fontStyle(int fontStyle) {
		this.setFontStyle(fontStyle);
		return this;
	}
	public TBCell indent(float indent) {
		this.setIndent(indent);
		return this;
	}
	@Override
	public String toString() {
		return "TBCell [border=" + border + ", textColor=" + textColor + ", lead=" + lead + ", fontSize=" + fontSize
				+ ", bgcolor=" + bgcolor + ", colspan=" + colspan + ", rowspan=" + rowspan + ", borderColor="
				+ borderColor + ", fontStyle=" + fontStyle + "]";
	}
	
	
}

用到的字体syst.ttf为思源宋体,可以换为你喜欢的字体,

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java使用itext 生成PDF,以生成个人简历为例 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 畅聊安全生产,对话B站、唯品会一线专家|TakinTalks大咖对谈

    安全生产 是业界新兴起的一种概念 来源于传统行业 加强安全生产就是为了防止和减少生产安全事故 保障人民群众生命和财产安全 促进经济社会持续健康发展 随着互联网发展 数字经济在经济总量中占比超30 在以IT系统为主要支撑的新兴互联网企业中 各
  • TypeError: Cannot convert a Symbol value to a string

    记一个坑 踩了几个小时才排查到 报错没有任何信息 背景是这样的 我在store中获取了router 我对目标route的matched进行遍历 match to matched let tempList match filter item
  • idea中debug按钮不显示问题处理汇总

    1 idea控制台下面根本不显示debug按钮问题 处理方案 按照图中标注进行操作 2 Debug按钮显示 console 控制台输出窗口不显示问题 处理方案 点击标注的按钮进行重置布局 3 Debug按钮显示 但是整个控制台都不显示 点击
  • 网络原理(五):IP 协议

    目录 认识IP 地址 子网掩码 作用 动态分配IP 地址 NAT 机制 认识MAC地址 MAC地址如何工作 网络设备和相关技术 集线器 转发所有端口 交换机 MAC地址转换表 转发 主机 路由器 ARP缓存表 ARP寻址 路由器 路由 NA
  • 基于STM32单片机的智能卡路里热量表WIFI无线手机控制

    系统功能设计 本系统由STM32F103C8T6单片机 称重传感器 WIFI模块及电源组成 1 手机APP和stm32设备上WIFI模块进行连接 2 通过称重传感器采集到的重量 然后将采集到的数据通过wifi发送给手机 3 手机定制app接
  • (12)Spring框架——MyBatis的学习之关联映射

    目录 一 知识点 1 配置文件元素 二 概述 1 项目结构 2 描述 三 实例 1 mybatis config xml 2 db properties 3 log4j properties 4 mapper 1 IdCardMapper
  • 三、Python学习(二)海龟模块turtle画笔介绍及命令详解(画圆)

    1 画笔的状态 在画布上 默认有一个坐标原点为画布中心的坐标轴 坐标原点上有一只面朝x轴正方向小乌龟 这里我们描述小乌龟时使用了两个词语 坐标原点 位置 面朝x轴正方向 方向 turtle绘图中 就是使用位置方向描述小乌龟 画笔 的状态 2
  • MAC中import的maven工程无法识别java程序以及依赖包无法加载等问题的解决办法

    maven工程无法识别java程序以及依赖包 1 问题背景 2 问题截图 3 问题分析 4 问题解决 不想浪费时间就直接看4 4 前三步是我摸索的过程 4 1 删除已有的 idea文件 重新import工程 无效 4 2 删掉该maven工
  • Qt样式表 基础篇(1)

    一 什么是Qt样式表 Qt样式表是一种强大的Qt机制 除了通过子类QStyle已经可以实现的功能之外 它还允许自定义小部件的外观 Qt样式表的概念 术语和语法深受HTML层叠样式表 CSS 的启发 但同时适应了Qt 的小窗体部件 二 概述
  • opencv中的split函数

    split函数的功能是通道分离 原型 void split const Mat src Mat mvBegin void split InputArray m OutputArrayOfArrays mv 用法很显然 第一个参数为要进行分离
  • Global Illumination_SDF Generate & Visualize & Shadow

    Signed Distance Field 有向距离场 简称SDF 这其实是图形学中非常常用的数学概念 数学上来说 是定义在空间中的一个标量场 标量值为空间一点到曲面的距离 曲面外的点为正值 曲面上的点为0 曲面内的点为负数 对于需要渲染的
  • kali linux基础配置和输入法转换

    一 修改密码 1 打开终端 terminal 进入方式 桌面左上角 桌面右键 Ctrl Alt T 输入sudo passwd root 然后回车 先输入原账户密码 回车 再输入root密码 回车 再一次重复输入 回车 设置完成 二 修改系
  • GLSL基础

    OpenGL Shading Language GLSL作为一种着色语言是纯粹的和GPU打交道的计算机语言 因为GPU是多线程并行处理器 所以GLSL直接面向SIMD模型的多线程计算 GLSL编写的着色器函数是对每个数据同时执行的 每个顶点
  • “$Bitmap 有标记已使用的未用簇”

    前几天在电脑上用 DiskGenius 给移动硬盘分区的时候出现了这个错误 如下图所示 解决方法 在 cmd 命令行窗口中输入如下代码 chkdsk f x c PS 其中 c 为需要进行操作的盘符 根据实际盘符修改 操作完成后再进行分区就
  • socket网络编程学习笔记(listen、accept、recv)

    listen 函数 功能 将套接字置于侦听传入连接的状态 语法 int WSAAPI listen SOCKET s int backlog 参数一 标识绑定的未连接套接字的描述符 参数二 挂起连接队列的最大长度 如果设置为 SOMAXCO
  • ABAP学习(16):ABAP2XLSX,操作excel

    ABAP2XLSX ABAP2XLS是一个操作EXCEL的开源项目 相比较OLE2和DOI方式操作excel更加方便 ABAP中搜索ZDEMO EXCEL 搜索Program可以查看SAP提供的示例程序 实现多种Excel 1 创建exce
  • 切片传递与指针传递到底有啥区别

    提出疑问 在Go的源码库或者其他开源项目中 会发现有些函数在需要用到切片入参时 它采用是指向切片类型的指针 而非切片类型 这里未免会产生疑问 切片底层不就是指针指向底层数组数据吗 为何不直接传递切片 两者有什么区别 例如 在源码log包中
  • Filter(过滤器)

    文章目录 1 Filter 的基本作用 2 Filter 的基本使用 3 Filter 的执行流程 4 Filter 执行需要注意的细节 4 1 拦截路径的配置 4 2 拦截路链 过滤器链 5 案例小结 登录验证 6 小结 1 Filter
  • 最近5年183个Java面试问题列表及答案[最全]

    Java 面试随着时间的改变而改变 在过去的日子里 当你知道 String 和 StringBuilder 的区别 String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 因此在每次对 St
  • Java使用itext 生成PDF,以生成个人简历为例

    在日常的应用中经常会有需求 生成pdf或者word文档 常见的第三方工具有Apache的poi 以及itext等等 这里使用itext生成pdf 以个人简历作为示例 了解itextde 使用 第0步 效果 第一步 引入依赖包