• 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

  • 相关阅读:
    【实战】PHP如何使用 ElasticSearch 做搜索
    基于PHP使用influxdb搭建监控服务系统
    influxdb 2.*版本与1.*版本区别
    rabbitmq的数据持久化
    基于纯真本地数据库的 IP 地址查询 PHP 源码
    【面试系列】主键索引和唯一索引谁更快?
    如何设计微博点赞功能数据库?
    降低composer版本(亲测可行)
    Compiler vs Interpreter
    Adobe AE问题排查 After Effects
  • 原文地址:https://www.cnblogs.com/zj68/p/14111115.html
Copyright © 2020-2023  润新知