iText实现Java生成PDF文件

pom.xml文件

		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>
		<dependency>
			<groupId>com.itextpdf.tool</groupId>
			<artifactId>xmlworker</artifactId>
			<version>5.5.11</version>
		</dependency>
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
		</dependency>

PDFUtil.java

package cn.zj.pdf;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
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.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;

public class PdfUtil1 {

	private static String FILE_DIR = "F:\java\";

	private static List<List<String>> dataDocumentModificationRecord() {
		List<List<String>> dataList = new ArrayList<List<String>>();
		
		List<String> data = new ArrayList<String>();
		data.add("2020-12-17");
		data.add("7.0.0");
		data.add("新增文档");
		data.add("XXX");
		dataList.add(data);
		
		return dataList;
	}
	
	/**
	 * 下载PDF
	 */
	public static void downPdf(String down2localFileName) {
		//Step 1—Create a Document.
		//1.新建document对象
		Document document = createDocument();
		try {
			//Step 2—Get a PdfWriter instance.
			//2.建立一个书写器(Writer)与document对象关联
			//PdfWriter.getInstance(document, new FileOutputStream(down2localFileName));
			
			PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(down2localFileName));
			writer.setPageEvent(new MyHeaderFooter1());// 页眉/页脚
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		//Step 3—Open the Document.
		//3.打开文档
		document.open();
		setDocumentAttr(document);//设置文档属性,可以不添加
		//Step 4—Add content.
		//4.向文档中添加内容
		try {
			//document.add();
			documentAddContent(document);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		//Step 5—Close the Document.
		//5.关闭文档
		document.close();
		
	}

	/**
	 * pdf内容添加
	 * @param document 
	 * @throws DocumentException 
	 */
	public static void documentAddContent(Document document) throws DocumentException {
		//封面
		addCover(document);
		
		//公共报文
		addPublicDocument(document);
		
		//选择的报文
		addSelectedDocument(document);
		
		String content= "一叶落便知秋意浓,即使江南的绿色褪色之期晚了几许,南飞的大雁也会在天空一会儿排成一字,一会儿排成人字,秋天真的来了,中秋真的来了,国庆真的来了。";
		//Chunk:块(Chunk)是能被添加到文档的文本的最小单位。
		//Phrase:短句(Phrase)是一系列以特定间距(两行之间的距离)作为参数的块。
		//Paragraph:段落是一系列块和(或)短句。同短句一样,段落有确定的间距。
		//用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。
		Paragraph paragraph = new Paragraph(content, chineseFont(24,0));
		document.add(paragraph);
	}

	/**
	 * 添加封面
	 * @param document
	 * @throws DocumentException
	 */
	public static void addCover(Document document) throws DocumentException {
		//添加logo
		addLogo(document);
		
		//添加titleCover
		addTitleCover(document);
		
		//添加横条线
		addLineCover(document);
		
		addEnter(document, 3);
		//添加副标题
		addSubHead(document);
		
		addEnter(document, 20);
		
		//出版社
		addPublishHouse(document);
		
		document.newPage();//跳转下一页
		
		addEnter(document, 7);
		//文档管理信息
		addDocumentManagementInfo(document);
		
		addEnter(document, 1);
		//文档修改记录
		addDocumentModificationRecord(document);
	}

	/**
	 * 公共报文
	 * @param document
	 * @throws DocumentException 
	 */
	private static void addPublicDocument(Document document) throws DocumentException {
		document.newPage();
		//前言
		addIntroductionDocument(document);
		
	}

	/**
	 * 选择的报文
	 * @param document
	 */
	private static void addSelectedDocument(Document document) {
		
	}

	/**
	 * 添加Logo
	 * @param document
	 * @throws DocumentException
	 */
	public static void addLogo(Document document) throws DocumentException {
		
		String resourcePath = getResourcePath();
		String logoPath = resourcePath + "static/img/timg.JPG";
		Image logo = setImageBorder(logoPath);
		
		Paragraph paragraph =new Paragraph();
		paragraph.add(logo); 
		
		document.add(logo);
	}

	/**
	 * 添加封面标题
	 * @param document
	 * @throws DocumentException 
	 */
	public static void addTitleCover(Document document) throws DocumentException {
		
		String titleCoverContent = "现金管理银企互联综合服务系统";
		
		Paragraph paragraph=new Paragraph(titleCoverContent,chineseFont(24, Font.BOLD));//设置字体样式
		paragraph.setAlignment(Element.ALIGN_RIGHT);//设置文字靠右
		paragraph.setSpacingBefore(5f); //设置段落上空白
		paragraph.setSpacingAfter(10f); //设置段落下空白
		
		document.add(paragraph);
	}

	/**
	 * 添加横线
	 * @param document
	 * @throws DocumentException
	 */
	public static void addLineCover(Document document) throws DocumentException {
		//参数
		//1.线宽度
		//2.直线长度,是个百分百,0-100之间
		//3.直线颜色
		//4.直线位置
		//5.上下移动位置
		LineSeparator line = new LineSeparator(28f,100,BaseColor.RED,Element.ALIGN_CENTER,-15f);
		
		Paragraph paragraph =new Paragraph();
		paragraph.add(new Chunk(line));
		
		document.add(line);
	}

	/**
	 * 副标题
	 * @param document
	 * @throws DocumentException
	 */
	private static void addSubHead(Document document) throws DocumentException {
		String subHead = "ERP接口开发手册";
		
		Chunk sigUnderline = new Chunk(subHead);//块
		sigUnderline.setUnderline(3f, -2f);//厚度,相对y方向位置
		sigUnderline.setFont(chineseFont(24, Font.BOLD|Font.UNDERLINE));
		
		Paragraph paragraph=new Paragraph();
		paragraph.setAlignment(Element.ALIGN_RIGHT);//设置文字靠右
		paragraph.setSpacingBefore(5f); //设置段落上空白
		paragraph.setSpacingAfter(10f); //设置段落下空白
		paragraph.add(sigUnderline);
		
		document.add(paragraph);
	}

	/**
	 * 出版社
	 * @param document
	 * @throws DocumentException
	 */
	private static void addPublishHouse(Document document) throws DocumentException {
		String content1 = "中国XX出版社";
		String content2 = "软件开发中心";
		
		Phrase phrase1 = new Phrase();//短句
		phrase1.setFont(chineseFont(16, Font.BOLD));
		phrase1.add(content1);
		
		Phrase phrase2 = new Phrase();
		phrase2.setFont(chineseFont(12, Font.NORMAL));
		phrase2.add(content2);
		
		Paragraph paragraph=new Paragraph();
		paragraph.setAlignment(Element.ALIGN_CENTER);
		paragraph.add(phrase1);
		paragraph.add(phrase2);
		
		document.add(paragraph);
	}

	/**
	 * 文档管理信息
	 * @param document
	 * @throws DocumentException
	 */
	private static void addDocumentManagementInfo(Document document) throws DocumentException {
		String content = "文档管理信息";
		Chunk chunk=new Chunk(content);
		chunk.setFont(chineseFont(wordSize2Pound("五号"), Font.NORMAL));
		
		//A4纸尺寸为592.52*839.16磅
		float contentSize = wordSize2Pound("五号");
		float left = (592.52f/2f) - 36f - content.length()/2f * contentSize;
		float right = (592.52f/2f) - 36f - content.length()/2f * contentSize;
		chunk.setBackground(BaseColor.RED, left, 10f, right, 0f);//左下右上
		
		Paragraph paragraph=new Paragraph();
		paragraph.add(chunk);
		paragraph.setAlignment(Element.ALIGN_CENTER);
		document.add(paragraph);
		
		//编号
		String c1 = "编号";
		Paragraph p1=new Paragraph(c1, chineseFont(12, Font.NORMAL));
		p1.setSpacingBefore(5f); //设置段落上空白
		p1.setSpacingAfter(10f); //设置段落下空白
		document.add(p1);
		//类别	接口文档
		String c2 = "类别    接口文档";
		Paragraph p2=new Paragraph(c2, chineseFont(12, Font.NORMAL));
		p2.setSpacingBefore(5f); //设置段落上空白
		p2.setSpacingAfter(10f); //设置段落下空白
		document.add(p2);
		//密级	公开
		String c3 = "密级    公开";
		Paragraph p3=new Paragraph(c3, chineseFont(12, Font.NORMAL));
		p3.setSpacingBefore(5f); //设置段落上空白
		p3.setSpacingAfter(10f); //设置段落下空白
		document.add(p3);
	}

	/**
	 * 文档修改记录
	 * @param document
	 * @throws DocumentException 
	 */
	private static void addDocumentModificationRecord(Document document) throws DocumentException {
		String content = "文档修改记录";
		Chunk chunk=new Chunk(content);
		chunk.setFont(chineseFont(wordSize2Pound("五号"), Font.NORMAL));
		
		//A4纸尺寸为592.52*839.16磅
		float contentSize = wordSize2Pound("五号");
		float left = (592.52f/2f) - 36f - content.length()/2f * contentSize;
		float right = (592.52f/2f) - 36f - content.length()/2f * contentSize;
		chunk.setBackground(BaseColor.RED, left, 10f, right, 0f);//左下右上
		
		Paragraph paragraph=new Paragraph();
		paragraph.add(chunk);
		paragraph.setAlignment(Element.ALIGN_CENTER);
		document.add(paragraph);
		
		addEnter(document, 1);
		
		//记录表格
		//PdfPTable table = createTable(4, Element.ALIGN_LEFT);
		PdfPTable table = createTable(new float[] {100f,60f,260f,100f});
		
		//tr th
		Font font_th = chineseFont(14, Font.BOLD);
		BaseColor backgroundColor_th = BaseColor.GRAY;
		String th1 = "日期";
		PdfPCell cell_th1 = createCell(th1, font_th);
		cell_th1.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th1);
		String th2 = "版本";
		PdfPCell cell_th2 = createCell(th2, font_th);
		cell_th2.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th2);
		String th3 = "描述信息";
		PdfPCell cell_th3 = createCell(th3, font_th);
		cell_th3.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th3);
		String th4 = "作者";
		PdfPCell cell_th4 = createCell(th4, font_th);
		cell_th4.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th4);
		
		//tr td
		Font font_td = chineseFont(14, Font.NORMAL);
		BaseColor backgroundColor_td = BaseColor.WHITE;
		
		List<List<String>> dataList = dataDocumentModificationRecord();
		
		for (int i = 0; i < 6; i++) {
			String td1 = " ";
			String td2 = " ";
			String td3 = " ";
			String td4 = " ";
			if(null != dataList && dataList.size() > i) {
				List<String> data = dataList.get(i);
				td1 = data.get(0);
				td2 = data.get(1);
				td3 = data.get(2);
				td4 = data.get(3);
			}
			//每行数据
			PdfPCell cell_td1 = createCell(td1, font_td);
			cell_td1.setBackgroundColor(backgroundColor_td);
			table.addCell(cell_td1);
			
			PdfPCell cell_td2 = createCell(td2, font_td);
			cell_td2.setBackgroundColor(backgroundColor_td);
			table.addCell(cell_td2);
			
			PdfPCell cell_td3 = createCell(td3, font_td);
			cell_td3.setBackgroundColor(backgroundColor_td);
			table.addCell(cell_td3);
			
			PdfPCell cell_td4 = createCell(td4, font_td);
			cell_td4.setBackgroundColor(backgroundColor_td);
			table.addCell(cell_td4);
		}
		
		table.setSplitLate(false);
		table.setSplitRows(false);//这个是设置表格的行是否跨页显示,默认true 跨页显示
		
		document.add(table);
	}
	
	/**
	 * 前言
	 * @param document
	 * @throws DocumentException 
	 */
	private static void addIntroductionDocument(Document document) throws DocumentException {
		//一级标题
		addIntroductionDocument_title1(document);
		
		//一级标题下内容
		addIntroductionDocument_title1_nextLevel(document);
		
		// TODO 添加跨行表格
		addTable(document);
	}

	/**
	 * 前言一级标题
	 * @param document
	 * @throws DocumentException 
	 */
	private static void addIntroductionDocument_title1(Document document) throws DocumentException {
		
		//前言开始磅数
		//1 前言
		String content_title1 = "1 前言";
		Paragraph title1 = new Paragraph(content_title1, chineseFont(26, Font.BOLD));
		document.add(title1);
		
		String content_content1 = "";
		if(null != content_content1 && !"".equals(content_content1)) {
			
			Paragraph content1 = new Paragraph(content_title1, chineseFont(26, Font.BOLD));
			document.add(content1);
		}
	}

	/**
	 * 一级标题下内容
	 * @param document
	 * @throws DocumentException 
	 */
	private static void addIntroductionDocument_title1_nextLevel(Document document) throws DocumentException {
		for (int i = 0; i < 9; i++) {
			
			//1.1 编写目的
			String title_1_1 = "1." + (i+1) + " 编写目的";
			Paragraph p_title_1_1 = new Paragraph(title_1_1, chineseFont(22, Font.BOLD));
			document.add(p_title_1_1);
			
			//1.1内容
			String content_1_1= "一叶落便知秋意浓,即使江南的绿色褪色之期晚了几许,南飞的大雁也会在天空一会儿排成一字,一会儿排成人字,秋天真的来了,中秋真的来了,国庆真的来了。";
			Paragraph p_content_1_1 = new Paragraph(content_1_1, chineseFont(12, Font.NORMAL));
			p_content_1_1.setFirstLineIndent(24);//首行缩进
			document.add(p_content_1_1);
		}
		
	}

	/**
	 * 添加跨行表格
	 * @param document
	 * @throws DocumentException 
	 */
	private static void addTable(Document document) throws DocumentException {
		PdfPTable table = createTable(new float[] {100f, 100f, 100f, 100f});
		
		Font font_th = chineseFont(14, Font.BOLD);
		BaseColor backgroundColor_th = BaseColor.GRAY;
		String th1 = "日期";
		PdfPCell cell_th1 = createCell(th1, font_th);
		cell_th1.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th1);
		String th2 = "版本";
		PdfPCell cell_th2 = createCell(th2, font_th);
		cell_th2.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th2);
		String th3 = "描述信息";
		PdfPCell cell_th3 = createCell(th3, font_th);
		cell_th3.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th3);
		String th4 = "作者";
		PdfPCell cell_th4 = createCell(th4, font_th);
		cell_th4.setBackgroundColor(backgroundColor_th);
		table.addCell(cell_th4);
		
		
		Font font_td = chineseFont(14, Font.NORMAL);
		
		for (int i = 0; i < 2; i++) {
			String td1 = "td1数据显示";
			PdfPCell cell_td1 = createCell(td1, font_td);
			table.addCell(cell_td1);
			String td2 = "td2数据显示";
			PdfPCell cell_td2 = createCell(td2, font_td);
			table.addCell(cell_td2);
			String td3 = "td3数据显示";
			PdfPCell cell_td3 = createCell(td3, font_td);
			table.addCell(cell_td3);
			String td4 = "td4数据显示";
			PdfPCell cell_td4 = createCell(td4, font_td);
			table.addCell(cell_td4);
		}
		
		String td5 = "td5数据显示";
		PdfPCell cell_td5 = createCell(td5, font_td);
		cell_td5.setRowspan(25);//合并行
		cell_td5.setColspan(2);
		table.addCell(cell_td5);
		
//		String td6 = "td6数据显示";
//		PdfPCell cell_td6 = createCell(td6, font_td);
//		table.addCell(cell_td6);
		String td7 = "td7数据显示td7数据显示td7数据显示td7数据显示";
		PdfPCell cell_td7 = createCell(td7, font_td);
		table.addCell(cell_td7);
		String td8 = "td8数据显示";
		PdfPCell cell_td8 = createCell(td8, font_td);
		table.addCell(cell_td8);
		
		for (int i = 0; i < 24; i++) {			
//			PdfPCell cell_td6_1 = createCell(td6, font_td);
//			table.addCell(cell_td6_1);
			PdfPCell cell_td7_1 = createCell(td7, font_td);
			table.addCell(cell_td7_1);
			PdfPCell cell_td8_1 = createCell(td8, font_td);
			table.addCell(cell_td8_1);
		}
		
		/*
		 * 如果出现某些行中的文本非常大, 那么iText将按照“行优先”的方式对表格进行分页处理, 所谓“行优先”是说:当遇到无法在当前页显示完整的一行时,
		 * 该行将被放到下一页进行显示,而只有当一整业都无法显示完此行时, iText才会将此行拆开显示在两页中。如果不想使用“行优先”的方式,
		 * 而是想采用“页优先”方式(保证填满当前页面的前提下,决定是否需要分拆行)显示, 可使用方法setSplitLate(false)
		 */
		//若为true时,当前页显示完整的一行时该行将被放到下一页进行显示,若此时跨行过大超出一页范围则报java.lang.NullPointerException
		table.setSplitLate(false);
		table.setSplitRows(true);//跨页显示
		document.add(table);
		
		
		
	}

	/**
	 * 获取项目资源路径 resource/
	 * @return
	 */
	public static String getResourcePath() {
		String resourcePath = PdfUtil1.class.getClass().getResource("/").getPath();
		return resourcePath;
	}

	/**
	 * 设置文档属性
	 * @param document
	 */
	public static void setDocumentAttr(Document document) {
//		document.addTitle("Title@PDF-Java");// 标题
//		document.addAuthor("Author@zj");// 作者
//		document.addSubject("Subject@iText pdf sample");// 主题
//		document.addKeywords("Keywords@iTextpdf");// 关键字
//		document.addCreator("Creator@zj");// 创建者

	}

	/**
	 * 自定义页面参数
	 * @return
	 */
	public static Document createDocument() {
		//页面大小  每边36磅页边距
		Rectangle rect = new Rectangle(PageSize.A4);
		//页面背景色
		rect.setBackgroundColor(BaseColor.WHITE);
		// 设置边框颜色
		rect.setBorderColor(BaseColor.RED);
		rect.setBorder(Rectangle.BOX);//设置边框
		rect.setBorderWidth(10);//边框宽度
		
		//Document document =new Document(); // 默认页面大小是A4
		//Document document =new Document(PageSize.A4); // 指定页面大小为A4
		//Document document =new Document(PageSize.A4,50,50,30,20); // 指定页面大小为A4,且自定义页边距(marginLeft、marginRight、marginTop、marginBottom)
		//其中页面大小PageSize也可自定义大小,例:
		Document document = new Document(rect);
		
		return document;
	}

	/**
	 * 添加换行
	 * @param document
	 * @param num	几次换行,默认不换行
	 * @throws DocumentException
	 */
	public static void addEnter(Document document, int num) throws DocumentException {
		if(0 == num) {
			return;
		}
		for (int i = 0; i < num; i++) {
			String content = "
";
			Paragraph paragraph = new Paragraph(content);
			
			document.add(paragraph);
		}
	}
	
	/**
	 * 字体设置
	 * 中文乱码
	 * @param size	字体大小
	 * @param style	字体样式,多个样式用"|"分隔
	 * @return
	 */
	public static Font chineseFont(float size, int style) {
		if(0 == size) {
			//默认字体
			size = Font.DEFAULTSIZE;
		}
		if(0 == style) {
			//默认无样式
			style = Font.NORMAL;
		}
		
		BaseFont bfChinese = null;
		try {
			//STSongStd-Light 是字体,在jar 中以property为后缀
			//UniGB-UCS2-H 是编码,在jar 中以cmap为后缀
			//H 代表文字版式是横版,相应的 V 代表竖版
			bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
			//bfChinese=BaseFont.createFont("C:/Windows/Fonts/msyh.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}//jar包
		
		//参数一:新建好的字体;参数二:字体大小,参数三:字体样式,多个样式用"|"分隔
		Font fontChinese = new Font(bfChinese, size, style);
		return fontChinese;
	}
	
	/**
	 * 中文字号和磅的换算
	 * @param wordSize
	 * @return
	 */
	public static float wordSize2Pound(String wordSize) {
		if(null == wordSize || "".equals(wordSize.trim())) {
			return 0f;
		}
		float pound = 0f;
		
		String[] wordSizes	= {
				"初号",	"小初", "一号", "小一",
				"二号", "小二", "三号", "小三",
				"四号", "小四", "五号", "小五",
				"六号", "小六", "七号", "八号"};
		float[] pounds = {
				42f,36f, 26f, 24f,
				22f, 18f, 16f, 15f,
				14f, 12f, 10.5f, 9f,
				7.5f, 6.5f, 5.5f, 5f};
		
		for (int i = 0; i < wordSizes.length; i++) {
			if(wordSizes[i].equals(wordSize.trim())) {
				pound = pounds[i];
			}
		}
		return pound;
	}
	
	/**
	 * 设置图片
	 * @param imgPath
	 * @return
	 */
	public static Image setImage(String imgPath) {
		Image image = null;
		try {
			image = Image.getInstance(imgPath);
		} catch (BadElementException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		image.setAlignment(Image.LEFT);
		image.scalePercent(40);//依照比例缩放
		
		return image;
	}
	
	/**
	 * 
	 * @param imgPath
	 * @param borderWidth
	 * @param borderColor
	 * @param rotationDegrees
	 * @return
	 */
//	public static Image setBorderImage(String imgPath, int borderWidth, BaseColor borderColor, float rotationDegrees) {
	public static Image setImageBorder(String imgPath) {
		Image image = setImage(imgPath);
		
		//设置图片边框
		//UNDEFINED = -1
		//TOP = 1
		//BOTTOM = 2
		//LEFT = 4
		//RIGHT = 8
		//NO_BORDER = 0
		//BOX = TOP + BOTTOM + LEFT + RIGHT
		image.setBorder(Image.BOX);
		image.setBorderWidth(10);//向内加宽
		image.setBorderColor(BaseColor.RED);//边框背景颜色
		image.setRotationDegrees(0);//旋转 正值为逆时针
		
		return image;
	}
	
//	public static void set(Paragraph paragraph) {
//		paragraph.setAlignment(1);//设置文字居中 0靠左   1,居中     2,靠右
//		paragraph.setIndentationLeft(12);// 左缩进  
//		paragraph.setIndentationRight(12);// 右缩进  
//		paragraph.setFirstLineIndent(24);// 首行缩进 
//		paragraph.setLeading(20f); //行间距
//		paragraph.setSpacingBefore(5f); //设置段落上空白
//		paragraph.setSpacingAfter(10f); //设置段落下空白
//	}
	
	/**
	 * 创建表格
	 * @param numColumns
	 * @param horizontalAlignment
	 * @return
	 */
	public static PdfPTable createTable(int numColumns, int horizontalAlignment) {
		PdfPTable table = new PdfPTable(numColumns);
		table.setTotalWidth(592.52f);
		table.setLockedWidth(true);
		table.setHorizontalAlignment(horizontalAlignment);//水平对齐
		table.getDefaultCell().setBorder(Rectangle.BOX);
		
//		table.setSpacingBefore(20);//设置段落上空白
//		table.setSpacingAfter(20);//设置段落上下空白
//		table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
//		table.setWidths(cellswidth);//设置表格的宽
//		table.setTotalWidth(1000f);//设置表格的总宽度
//		table.setWidthPercentage(100);//设置表格宽度的百分比

		return table;
	}
	
	/**
	 * 创建表格
	 * @param widths
	 * @param horizontalAlignment
	 * @return
	 */
	public static PdfPTable createTable(float[] widths) {
		PdfPTable table = new PdfPTable(widths);
		try {
			table.setTotalWidth(widths);
			table.setLockedWidth(true);
			//table.setHorizontalAlignment(horizontalAlignment);//水平对齐
			table.getDefaultCell().setBorder(Rectangle.BOX);
			
//			table.setSpacingBefore(20);//设置段落上空白
//			table.setSpacingAfter(20);//设置段落上下空白
//			table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
//			table.setWidths(cellswidth);//设置表格的宽
//			table.setTotalWidth(1000f);//设置表格的总宽度
//			table.setWidthPercentage(100);//设置表格宽度的百分比
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return table;
	}
	
	/**
	 * 创建单元格(指定字体)
	 * 默认水平左对齐,垂直居中
	 * @param content	单元格内容
	 * @param font		字体
	 * @return
	 */
	public static PdfPCell createCell(String content, Font font) {
		PdfPCell cell = new PdfPCell();
		
//		ALIGN_LEFT = 0;
//		ALIGN_CENTER = 1;
//		ALIGN_RIGHT = 2;
		cell.setHorizontalAlignment(Element.ALIGN_LEFT);//水平对齐方式
//		ALIGN_TOP = 4
//		ALIGN_MIDDLE = 5
//		ALIGN_BOTTOM = 6
//		ALIGN_BASELINE = 7
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直对齐方式
		
		Phrase phrase = new Phrase(content, font);
		cell.setPhrase(phrase);//填充数据
		
		return cell;
	}
	
	/**
	 * 创建单元格(指定字体、水平对齐方式)
	 * 垂直居中
	 * @param content	单元格内容
	 * @param font		字体
	 * @param horizontalAlignment	水平对齐方式
	 * @return
	 */
	public static PdfPCell createCell(String content, Font font, int horizontalAlignment) {
		PdfPCell cell = new PdfPCell();
		
//		ALIGN_LEFT = 0;
//		ALIGN_CENTER = 1;
//		ALIGN_RIGHT = 2;
		cell.setHorizontalAlignment(horizontalAlignment);//水平对齐方式
//		ALIGN_TOP = 4
//		ALIGN_MIDDLE = 5
//		ALIGN_BOTTOM = 6
//		ALIGN_BASELINE = 7
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直对齐方式
		
		Phrase phrase = new Phrase(content, font);
		cell.setPhrase(phrase);//填充数据
		
		return cell;
	}
	/**
	 * 创建单元格(指定字体、水平对齐方式、垂直对齐方式)
	 * @param content	单元格内容
	 * @param font		字体
	 * @param horizontalAlignment	水平对齐方式
	 * @param verticalAlignment		垂直对齐方式
	 * @return
	 */
	public static PdfPCell createCell(String content, Font font, int horizontalAlignment, int verticalAlignment) {
		PdfPCell cell = new PdfPCell();
		
//		ALIGN_LEFT = 0;
//		ALIGN_CENTER = 1;
//		ALIGN_RIGHT = 2;
		cell.setHorizontalAlignment(horizontalAlignment);//水平对齐方式
		
//		ALIGN_TOP = 4
//		ALIGN_MIDDLE = 5
//		ALIGN_BOTTOM = 6
//		ALIGN_BASELINE = 7
		cell.setVerticalAlignment(verticalAlignment);//垂直对齐方式
		
		Phrase phrase = new Phrase(content, font);
		cell.setPhrase(phrase);//填充数据
		
		return cell;
	}
	
	/**
	 * 创建单元格(指定字体、水平对齐方式、单元格跨x列合并)
	 * 默认垂直居中
	 * @param content
	 * @param font
	 * @param horizontalAlignment
	 * @param colspan
	 * @return
	 */
	public static PdfPCell createCellColspan(String content, Font font, int horizontalAlignment, int colspan) {
		PdfPCell cell = new PdfPCell();
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
		cell.setHorizontalAlignment(horizontalAlignment);
		cell.setColspan(colspan);
		cell.setPhrase(new Phrase(content, font));
		return cell;
	}
	
	/**
	 * 创建单元格(指定字体、水平对齐方式、单元格跨x列合并、设置单元格内边距)
	 * 默认垂直居中
	 * @param value
	 * @param font
	 * @param align
	 * @param colspan
	 * @return
	 */
	public PdfPCell createCellBorder(String value, Font font, int horizontalAlignment, int colspan) {
		PdfPCell cell = new PdfPCell();
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
		cell.setHorizontalAlignment(horizontalAlignment);
		cell.setColspan(colspan);
		cell.setPhrase(new Phrase(value, font));
		cell.setPadding(3.0f);//设置单元格内内容的填充(内容与边框之间的空格)
		
		cell.setBorder(0);//0表示无边框
		cell.setPaddingTop(8.0f);//属性填充顶部
		cell.setPaddingBottom(8.0f);//属性填充底部
		return cell;
	}

	
	
	public static void main(String[] args) {
		downPdf(FILE_DIR + "createSamplePDF1.pdf");
		System.out.println("操作成功");
	}
	
	@Test
	public void method() {
		cm2pound(10);//单位毫米
	}

	private void cm2pound(int cm) {
		float pound= 592.52f/297 * cm;
		System.out.println(pound);
	}
}

  

MyHeaderFooter1.java

package cn.zj.pdf;

import java.io.IOException;

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.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;

public class MyHeaderFooter1 extends PdfPageEventHelper {

	private static Font chineseFont;
	private PdfTemplate totalPage;

	static {
		try {
			chineseFont = new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL);
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 打开文档时,创建一个总页数的模版
	 */
	public void onOpenDocument(PdfWriter writer, Document document) {
		PdfContentByte pdfContentByte = writer.getDirectContent();
		totalPage = pdfContentByte.createTemplate(30f, 16f);
	}
	
	public void onEndPage(PdfWriter writer, Document document) {
		PdfPTable table = new PdfPTable(3);
		
		int pageNumber = writer.getPageNumber();
		if(pageNumber >= 3) {//前两页为封皮,不用加页眉页脚
			try {
				table.setTotalWidth(PageSize.A4.getWidth() - 100);
				table.setWidths(new int[] { 24, 24, 3});
				table.setLockedWidth(true);
				table.getDefaultCell().setFixedHeight(-10);//设置单元格的固定高度
				table.getDefaultCell().setBorder(Rectangle.BOTTOM);
				
				table.addCell(new Paragraph("我是页眉/页脚", chineseFont));// 可以直接使用addCell(str),不过不能指定字体,中文无法显示
				table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
				table.addCell(new Paragraph("第" + (writer.getPageNumber() - 2) + "页/", chineseFont));
				// 总页数
				PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
				cell.setBorder(Rectangle.BOTTOM);
				table.addCell(cell);
				// 将页眉写到document中,位置可以指定,指定到下面就是页脚
				// PageSize.A4.getHeight() = 842.0
				// table.writeSelectedRows(0, -1, 50,PageSize.A4.getHeight() - 20, writer.getDirectContent());
				// 如果使用PageSize.A4.getHeight()则writer.getPageNumber()应该减去2 ,写在当页的最上部
				//如果使用PageSize.A4.getBottom()则writer.getPageNumber()应该减去3,写在当页的最下部
				table.writeSelectedRows(0, -1, 50,PageSize.A4.getBottom() + 30, writer.getDirectContent());
			} catch (DocumentException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 全部完成后,将总页数的pdf模版写到指定位置
	 */
    public void onCloseDocument(PdfWriter writer,Document document) {
    	//减去2 去掉封面的两页
        String text = "总" + (writer.getPageNumber() - 2) + "页";
        ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,chineseFont), 2, 2, 0);
    }

}

  

其中 图片位置/project/src/main/resources/static/img/timg.JPG

原文地址:https://www.cnblogs.com/zj68/p/14111115.html