zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    poj 2584 T-Shirt Gumbo (二分匹配)
    hdu 1757 A Simple Math Problem (乘法矩阵)
    矩阵之矩阵乘法(转载)
    poj 2239 Selecting Courses (二分匹配)
    hdu 3661 Assignments (贪心)
    hdu 1348 Wall (凸包)
    poj 2060 Taxi Cab Scheme (二分匹配)
    hdu 2202 最大三角形 (凸包)
    hdu 1577 WisKey的眼神 (数学几何)
    poj 1719 Shooting Contest (二分匹配)
  • 原文地址:https://www.cnblogs.com/zj68/p/14111115.html
Copyright © 2011-2022 走看看