当前位置 : 主页 > 编程语言 > java >

java 后端生成pdf模板合并单元格表格的案例

来源:互联网 收集:自由互联 发布时间:2021-04-03
这里只放部分片段的代码 java中使用二维数组生成表格非常方便,但是每一维的数组都需要排好序,而且,在java中所谓的二维数组,三维数组等,其实都是多个一维数组组成的 /** * 添加子女教

这里只放部分片段的代码

java中使用二维数组生成表格非常方便,但是每一维的数组都需要排好序,而且,在java中所谓的二维数组,三维数组等,其实都是多个一维数组组成的

	/**
 	 * 添加子女教育规划表。
 	 * @param name 子女姓名
 	 * @param educationItems 某个孩子的教育规划的二维数组,每列依次是:学程阶段、年数、费用支出(元)/年、年增长率
 	 * @param spacing
 	 * @throws DocumentException
 	 * @throws IOException
 	 */
private void addEducationTable(String name, String[][] educationItems, float spacing) throws DocumentException, IOException
	{
	addParagraphText(name + "的教育支出规划如下:", getMainTextFont(), 0, SPACING_5, LEADING_MULT);//标题字段
	//以下是表头
	float[] colWidth = new float[] { mm2px_width(34f), mm2px_width(34f), mm2px_width(34f), mm2px_width(34f), mm2px_width(34f) };
				String[] colName = { "学程阶段", "年数", "规划值(首次)","发生值(首次)", "年增长率" };//表头列的一维数组
				int[] colAlignment = {Element.ALIGN_LEFT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT }; //表头有几列就写几个对齐方式
				float[] colPaddingLeft = { 3f, 3f, 3f, 3f, 3f };
				float[] colPaddingRight = { 3f, 3f, 3f, 3f, 3f };
				Font[] colFont = { getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont() };//字体及颜色的设置
				educationItems=swap(educationItems, 3, 4);//这是排序二维数组,把第4列换到第3行(从0开始计数)
				PdfPTable table = tableTemplate(educationItems, colWidth, colName, colAlignment, colPaddingLeft, colPaddingRight, colFont);//生成表格
				table.setSpacingAfter(mm2px_height(spacing)); 
				this._document.add(table);//生成到PDF去,代码就不贴了
	}
/**
	 * @param items 二维数组表示的表
	 * @param colWidth 各列的宽度(像素)
	 * @param colName 各列的名称
	 * @param colAlignment 各列的水平对齐方式
	 * @param colPaddingLeft 各列的左padding
	 * @param colPaddingRight 各列的右padding
	 * @param colFont 各列的字体
	 * @return
	 * @throws DocumentException
	 * @throws IOException
	 */
	private PdfPTable tableTemplates(String[][] items, float[] colWidth, String[] colName, int[] colAlignment,
			float[] colPaddingLeft, float[] colPaddingRight, Font[] colFont) throws DocumentException, IOException
	{
		PdfPTable intTable = new PdfPTable(colWidth.length); 
		intTable.setTotalWidth(colWidth);
		intTable.setLockedWidth(true);
		
	 intTable.getDefaultCell().setLeading(mm2px_height(LEADING_CELL_TEXT), 1f); //单元格内文字行间距
	 intTable.getDefaultCell().setBorderColor(COLOR_CELL_BORDER); //边框颜色
	 intTable.setHeaderRows(1); //第一行做表头,跨页再现表头
	 
	 //单元格可以跨页
	 intTable.setSplitLate(false);
	 intTable.setSplitRows(true);
	 /*********************************************************************************************/
	 /***********************************以下是表头标题栏*******************************************/
	 float headerHeight = mm2px_height(TABLE_HEADER_HEIGHT);
	 intTable.getDefaultCell().setFixedHeight(headerHeight); //行高
	 intTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); //无边框
	 
	 for(int i = 0; i < colName.length; i++)
	 {
	 	intTable.getDefaultCell().setBackgroundColor(COLOR_TAB_HEADER); //表头背景
			intTable.getDefaultCell().setHorizontalAlignment(colAlignment[i]);
			intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[i]);
			intTable.getDefaultCell().setPaddingRight(colPaddingRight[i]);
			
			intTable.addCell(new Paragraph(colName[i], getTabHeaderTextFont()));
	 }
	 /*********************************************************************************************/
	 /***********************************以下是表格每行*********************************************/
	 float rowHeight = mm2px_height(TABLE_ROW_HEIGHT);
	 intTable.getDefaultCell().setMinimumHeight(rowHeight); //单元格内文字不确定,不能设置成固定行高 
	 intTable.getDefaultCell().setBackgroundColor(COLOR_CELL_BACK_WHITE);
	 for(int i = 0; i < items.length; i++)
	 {
	 	if(i == items.length - 1) //最后一行有合并单元格
	 	{
	 		intTable.getDefaultCell().setColspan(6);//设置具体合并哪一列
	 		intTable.getDefaultCell().setHorizontalAlignment(colAlignment[0]);
				intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[0]);
				intTable.getDefaultCell().setPaddingRight(colPaddingRight[0]);
	 	 intTable.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM); 
	 	 intTable.addCell(new Paragraph(items[i][0], colFont[0]));
	 	}else{
	 		for(int j = 0; j < items[i].length; j++)
	 		{
	 			if(j == 0)intTable.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
	 			else intTable.getDefaultCell().setBorder(Rectangle.RIGHT | Rectangle.BOTTOM); 
	 			if(j < colAlignment.length){	
					intTable.getDefaultCell().setHorizontalAlignment(colAlignment[j]);
					intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[j]);
					intTable.getDefaultCell().setPaddingRight(colPaddingRight[j]);
					intTable.addCell(new Paragraph(items[i][j], colFont[j]));
	 		}
	 	}
	 	}
	 }
	 /*********************************************************************************************/
	 
	 return intTable;
	}
/*
*二维数组根据指定列排序到指定位置的方法,f2要大于f1
*/
public String[][] swap(String[][] data,int f1,int f2){
		for (int i = 0; i < data.length; i++) {
			String tamp=data[i][f2];
			for (int j = f2; j >f1; j--) {
				data[i][j]=data[i][j-1];
			}
			data[i][f1]=tamp;
		}
		return data;
	}
	/**
	 * @return 获取表头标题栏字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTabHeaderTextFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_SIMHEI), FONT_SIZE_TAB_HEADER_TEXT, Font.NORMAL, COLOR_TAB_HEADER_TEXT);
	}
	/**
	 * @return 获取单元格文字字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTabCellTextFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_SIMHEI), FONT_SIZE_TAB_CELL_TEXT, Font.NORMAL, GDM.COLOR_666666);
	}
	
	/**
	 * @return 获取标题字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTitleFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_HEADER_CH), FONT_SIZE_TITLE, Font.NORMAL, GDM.COLOR_333333);
	}	
	
	/**
	 * @return 获取标题字体(小)。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTitleFont_Small() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_HEADER_CH), FONT_SIZE_TITLE - 1f, Font.NORMAL, GDM.COLOR_333333);
	}
	
	/**
	 * @return 获取正文字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getMainTextFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_NORMAL), FONT_SIZE_MAINTEXT, Font.NORMAL, GDM.COLOR_666666);
	}

加一个生成pdf常用的格式工具类

import java.io.IOException;
import java.net.MalformedURLException;
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.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
public class FinPlan 
{
	protected Document _document; //文档对象
	protected PdfWriter _writer; //pdf文档输出器	
	public FinPlan(Document document, PdfWriter writer) 
	{
		super();
		this._document = document;
		this._writer = writer;
	}
	/**
	 * 像素到毫米的转换(高度)
	 * @param px 纵向像素
	 * @return
	 */
	public static float px2mm_height(float px)
	{
		return px * GDM.PAGE_HEIGHT / PageSize.A4.getHeight();
	}	
	/**
	 * 在指定位置写入文字
	 * @param text 需要写入的文字
	 * @param xPoint 距左边位置(毫米)
	 * @param yPoint 距底边位置(毫米)
	 */
	protected void writeOnSpLocation(float xPoint, float yPoint, String text, Font font)
	{
		PdfContentByte pcb = this._writer.getDirectContent();
		
		xPoint = mm2px_width(xPoint);
		yPoint = mm2px_height(yPoint);
		Paragraph prg = new Paragraph(text, font);		
		ColumnText.showTextAligned(pcb, PdfContentByte.ALIGN_LEFT, prg, xPoint, yPoint, 0);
	}	
	/**
	 * 添加标题。
	 * @param title 标题
	 * @param font 标题字体
	 * @param spacingBefore 标题前的空白(毫米)
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addTitle(String title, Font font, float spacingBefore) throws DocumentException, IOException
	{
		addTitle(title, font, spacingBefore, 0f);
	}	
	/**
	 * 添加标题。
	 * @param title 标题
	 * @param font 标题字体
	 * @param spacingBefore 标题前的空白(毫米)
	 * @param spacingAfter 标题后的空白(毫米)
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addTitle(String title, Font font, float spacingBefore, float spacingAfter) throws DocumentException, IOException
	{
		Paragraph prg = new Paragraph(title, font);
		spacingBefore = mm2px_height(spacingBefore);
		prg.setSpacingBefore(prg.getLeading() * -1 + prg.getFont().getSize() * 0.8f + spacingBefore);
		//prg.setSpacingAfter(spacingAfter);
		this._document.add(prg);		
		addSpan(spacingAfter);
	}	
	/**
	 * 添加标题。
	 * @param title 标题
	 * @param font 标题字体
	 * @param spacingBefore 标题前的空白(毫米)
	 * @param spacingAfter 标题后的空白(毫米)
	 * @param alignment 标题的对齐方式(居中用Element.ALIGN_CENTER)
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addTitle(String title, Font font, float spacingBefore, float spacingAfter, int alignment) throws DocumentException, IOException
	{
		Paragraph prg = new Paragraph(title, font);
		spacingBefore = mm2px_height(spacingBefore);
		prg.setSpacingBefore(prg.getLeading() * -1 + prg.getFont().getSize() * 0.8f + spacingBefore);
		prg.setAlignment(alignment);
		//prg.setSpacingAfter(spacingAfter); 改用下面的 addSpan(spacingAfter);
		this._document.add(prg);		
		addSpan(spacingAfter);
	}	
	/**
	 * 添加段落文本。
	 * @param text 段落文本
	 * @param font 字体
	 * @param spacingBefore 段落前的空白(毫米)
	 * @param leadingMult 文本行间距倍数
	 * @throws DocumentException
	 */
	protected void addParagraphText(String text, Font font, float spacingBefore, float leadingMult) throws DocumentException
	{	
		addParagraphText(text, font, spacingBefore, 0f, leadingMult);
	}	
	/**
	 * 添加段落文本。
	 * @param text 段落文本
	 * @param font 字体
	 * @param spacingBefore 段落前的空白(毫米)
	 * @param spacingAfter 段落后的空白(毫米)
	 * @param leadingMult 文本行间距倍数
	 * @throws DocumentException
	 */
	protected void addParagraphText(String text, Font font, float spacingBefore, float spacingAfter, float leadingMult) throws DocumentException
	{
		Paragraph prg = new Paragraph(text, font); //.trim()
		spacingBefore = mm2px_height(spacingBefore);
		//spacingAfter = mm2px_height(spacingAfter);
		prg.setLeading(prg.getLeading() * leadingMult);
		prg.setSpacingBefore(prg.getLeading() * -1f + prg.getFont().getSize() * 0.8f + spacingBefore); 
		//prg.setSpacingAfter(spacingAfter);
		//prg.setFirstLineIndent(prg.getFont().getSize() * 2f); //首行缩进
		prg.setAlignment(Element.ALIGN_LEFT); //对齐方式
		this._document.add(prg);
		
		addSpan(spacingAfter);
	}
	
	/**
	 * 添加跨页后不再起作用的间隔。
	 * @param gap 间隔大小(毫米)
	 * @throws DocumentException
	 */
	protected void addSpan(float gap) throws DocumentException
	{
		PdfPTable spanTable = new PdfPTable(1);
		spanTable.setTotalWidth(this._document.right() - this._document.left());
		spanTable.setLockedWidth(true);
		spanTable.getDefaultCell().setBorder(Rectangle.NO_BORDER);
		spanTable.setSpacingAfter(mm2px_height(gap)); //表后面的间隔,跨页之后不再起作用,要的就是这个效果		
		spanTable.addCell("");
		this._document.add(spanTable);
	}	
	/**
	 * 添加每一章的头部文字。
	 * @param headerCH 头部中文
	 * @param headerEN 头部英文
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addChapterHeader(String headerCH, String headerEN) throws DocumentException, IOException
	{
		Font fontCH = getFont(GDM.getUrlString(GDM.FONT_HEADER_CH), GDM.FONT_SIZE_HEADER_CH, Font.NORMAL, GDM.COLOR_GOLD);
		Font fontEN = getFont(GDM.getUrlString(GDM.FONT_HEADER_EN), GDM.FONT_SIZE_HEADER_EN, Font.NORMAL, GDM.COLOR_GOLD);
		
		Phrase phrase = new Phrase();
		Chunk chunkCH = new Chunk(headerCH, fontCH);
		phrase.add(chunkCH);
		phrase.add(Chunk.NEWLINE);
 	Chunk chunkEN = new Chunk(headerEN, fontEN);
 	phrase.add(chunkEN);
 	
 	Paragraph prg = new Paragraph(phrase); 	
		prg.setSpacingAfter(mm2px_width(GDM.SPACING_AFTER_HEADER));
		this._document.add(prg);
	}
	
	/**
	 * 添加小节的头部图片
	 * @param imgFilename 含路径的图片文件名
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addSectionHeader(String imgFilename) throws MalformedURLException, IOException, DocumentException
	{	
		Paragraph prg = new Paragraph("");
		prg.setLeading(0);
		this._document.add(prg);//在新开页中,上面段落的行间距会影响图片的位置
		
		float width = GDM.PAGE_WIDTH - GDM.MARGIN_LEFT - GDM.MARGIN_RIGHT;
		float height = GDM.HEIGHT_SECTIONHEADER;		
		addImage(imgFilename, width, height);
	}	
	/**
	 * 添加图片。
	 * @param imgFilename 含路径的图片文件名
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addImage(String imgFilename, float width, float height) throws MalformedURLException, IOException, DocumentException
	{
		Image img = Image.getInstance(imgFilename);
		addImage(img, width, height);
	}	
	/**
	 * 添加图片。
	 * @param imgByte 图片内存数组
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addImage(byte[] imgByte, float width, float height) throws MalformedURLException, IOException, DocumentException
	{
		Image img = Image.getInstance(imgByte);
		addImage(img, width, height);
	}	
	/**
	 * 添加图片。	 
	 * @param img 图片
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @throws DocumentException
	 */
	private void addImage(Image img, float width, float height) throws DocumentException
	{
		img.setAlignment(Image.ALIGN_LEFT);
		width = mm2px_width(width);
		height = mm2px_height(height);
		img.scaleAbsolute(width, height);		
		this._document.add(img);
	}	
	/**
	 * 在指定位置添加图片。
	 * @param imgFilename 含路径的图片文件名
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @param xPoint 距左边位置(毫米)
	 * @param yPoint 距底边位置(毫米)
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addImageOnSpLocation(String imgFilename, float width, float height, float xPoint, float yPoint) throws MalformedURLException, IOException, DocumentException
	{
		Image img = Image.getInstance(imgFilename);
		img.setAlignment(Image.ALIGN_LEFT);		
		width = mm2px_width(width);
		height = mm2px_height(height);
		img.scaleAbsolute(width, height);		
		xPoint = mm2px_width(xPoint);
		yPoint = mm2px_height(yPoint);
		img.setAbsolutePosition(xPoint, yPoint);		
		this._document.add(img);
	}	
	/**
	 * 画线。
	 * @param beginX 开始X坐标(毫米)
	 * @param beginY 开始Y坐标(毫米)
	 * @param endX 终止X坐标(毫米)
	 * @param endY 终止Y坐标(毫米)
	 * @param lineWidth
	 * @param color
	 */
	protected void drawLint(float beginX, float beginY, float endX, float endY, float lineWidth, BaseColor color)
	{
		PdfContentByte cb = _writer.getDirectContent();
		cb.setLineWidth(lineWidth);
		cb.setColorStroke(color);		
		beginX = mm2px_width(beginX);
		beginY = mm2px_height(beginY);
		endX = mm2px_width(endX);
		endY = mm2px_height(endY);		
		cb.moveTo(beginX, beginY);
		cb.lineTo(endX, endY);		
		cb.stroke();
	}
	
	/**
	 * 添加新的页面
	 */
	protected void newPage()
	{
		this._document.newPage();
		//this._writer.setPageEmpty(false); //fasle-页内容为空依然显示; true-页内容为空不会显示
	}	
	/**
	 * 获取字体。
	 * @param fontname 字体名称(含路径)
	 * @param fontsize 字体大小
	 * @param fontstyle 字体风格
	 * @param color 字体颜色
	 * @return 字体
	 * @throws DocumentException
	 * @throws IOException
	 */	
	public static Font getFont(String fontname, float fontsize, int fontstyle, BaseColor color) throws DocumentException, IOException
	{
		BaseFont bfont = BaseFont.createFont(fontname, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		return new Font(bfont, fontsize, fontstyle, color);
	}	
	/**
	 * 像素到毫米的转换(宽度)
	 * @param px 横向像素
	 * @return
	 */
	public static float px2mm_width(float px)
	{
		return px * GDM.PAGE_WIDTH / PageSize.A4.getWidth();
	}	
	/**
	 * 毫米到像素的转换(宽度)
	 * @param mm 横向毫米
	 * @return
	 */
	public static float mm2px_width(float mm)
	{
		return mm * PageSize.A4.getWidth() / GDM.PAGE_WIDTH; //A4纸宽210毫米
	}
	/**
	 * 毫米到像素的转换(高度)
	 * @param mm 纵向毫米
	 * @return
	 */
	public static float mm2px_height(float mm)
	{
		return mm * PageSize.A4.getHeight() / GDM.PAGE_HEIGHT; //A4纸高297毫米
	}
	
	/**
	 * 添加法律声明、我们的观点、假设和依据、资产配置策略。
	 * @version 2017-03-30
	 * @param segments 文字或图片
	 * @param font 字体
	 * @param spacingBefore 段落前的空白(毫米)
	 * @param leadingMult 行间距
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addPdfWord(Object[] segments, Font font, float spacingBefore, float leadingMult) throws MalformedURLException, IOException, DocumentException
	{
		for(Object obj : segments)
		{
			if(obj instanceof byte[])
			{
				Image img = Image.getInstance((byte[])obj);
				addImageTab(img);
			}
			else if(obj instanceof String)
			{
				addParagraphText((String)obj, font, spacingBefore, px2mm_height(font.getSize()) * leadingMult, leadingMult);
			}	
		}
	}	
	/**
	 * 以表格的方式添加图片。
	 * @version 2017-04-19
	 * @param img 图片
	 * @throws DocumentException
	 */
	protected void addImageTab(Image img) throws DocumentException
	{		
		float imgWidth = img.getWidth();
		float imgHeight = img.getHeight();
		float docWidth = this._document.right() - this._document.left();
		float docHeight = this._document.top() - this._document.bottom() - 5f * 2;
		
		float scalePercent_w = 100f;
		if(imgWidth > docWidth) scalePercent_w = docWidth * 100f / imgWidth;
		float scalePercent_h = 100f;
		if(imgHeight > docHeight) scalePercent_h = docHeight * 100f / imgHeight;
		
		float scalePercent = Math.min(scalePercent_w, scalePercent_h);
		float fixedHeight = imgHeight * scalePercent / 100f;
		
		img.setAlignment(Image.ALIGN_LEFT);
		img.scalePercent(scalePercent);
		
		PdfPTable table = new PdfPTable(1); 
 	table.setWidthPercentage(100f);
 	
		PdfPCell imgCell = new PdfPCell(img);
		imgCell.setPadding(0f);
		imgCell.setFixedHeight(fixedHeight);
		imgCell.setBorder(Rectangle.NO_BORDER);
		table.addCell(imgCell);
		table.setHorizontalAlignment(Element.ALIGN_CENTER);
		table.setSpacingAfter(5f);
		table.setSpacingBefore(5f);
		table.keepRowsTogether(0);		
		this._document.add(table);
	}	
	/**
	 * 根据所在区域的宽高对图片进行不变形缩放。
	 * @param imgByte 图片
	 * @param scaleWidth 所在区域宽度
	 * @param scaleHeight 所在区域高度
	 * @return
	 * @throws BadElementException
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	protected Image scaledImage(byte[] imgByte, float scaleWidth, float scaleHeight) throws BadElementException, MalformedURLException, IOException
	{
		Image img = Image.getInstance(imgByte);		
		float imgWidth = img.getWidth();
		float imgHeight = img.getHeight();	
		float scalePercent_w = 100f;
		if(imgWidth > scaleWidth) scalePercent_w = scaleWidth * 100f / imgWidth;
		float scalePercent_h = 100f;
		if(imgHeight > scaleHeight) scalePercent_h = scaleHeight * 100f / imgHeight;
		
		float scalePercent = Math.min(scalePercent_w, scalePercent_h);
		img.setAlignment(Image.ALIGN_LEFT);
		img.scalePercent(scalePercent);			
		return img;
	}	
	/**
	 * 获取文档可操作区域的宽度(像素)。
	 * @return
	 */
	protected float getDocWidth()
	{
		return this._document.right() - this._document.left();
	}
}

补充:java动态生成pdf含表格table和 合并两个pdf文件功能

1.首先一样需要maven依赖包:

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
 <dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itextpdf</artifactId>
 <version>5.5.10</version>
 </dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
 <dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itext-asian</artifactId>
 <version>5.2.0</version>
 </dependency>

2.废话不多说,上代码,直接拿去运行测试:

public static void test1(){//生成pdf
 BaseFont bf;
  Font font = null;
  try {
  bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H",
   BaseFont.NOT_EMBEDDED);//创建字体
  font = new Font(bf,12);//使用字体
  } catch (Exception e) {
  e.printStackTrace();
  }
  Document document = new Document();
  try {
  PdfWriter.getInstance(document, new FileOutputStream("E:/测试.pdf"));
  document.open();
  document.add(new Paragraph("就是测试下",font));//引用字体
  document.add(new Paragraph("真的测试下",font));//引用字体
  
  float[] widths = {25f,25f,25f };// 设置表格的列宽和列数 默认是4列 
  PdfPTable table = new PdfPTable(widths);// 建立一个pdf表格 
  table.setSpacingBefore(20f); 
  table.setWidthPercentage(100);// 设置表格宽度为100% 
  
  PdfPCell cell = null; 
  cell = new PdfPCell(new Paragraph("姓名",font));// 
  cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
  cell.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell);
  
  cell = new PdfPCell(new Paragraph("性别",font));// 
  cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
  cell.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell);
  
  cell = new PdfPCell(new Paragraph("身份证号",font));// 
  cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
  cell.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.addCell(cell);
 
  //以下代码的作用是创建100行数据,其中每行有四列,列依次为 编号 姓名 性别 备注
  for (int i = 1; i <=10; i++) {
   //设置编号单元格
  PdfPCell cell11=new PdfPCell(new Paragraph("aa名媛",font));
  PdfPCell cell22=new PdfPCell(new Paragraph("bb女",font));
  PdfPCell cell33=new PdfPCell(new Paragraph("cc花姑娘",font));
 
   //单元格水平对齐方式
   cell11.setHorizontalAlignment(Element.ALIGN_CENTER);
   //单元格垂直对齐方式
   cell11.setVerticalAlignment(Element.ALIGN_CENTER); 
   cell22.setHorizontalAlignment(Element.ALIGN_CENTER);
   cell22.setVerticalAlignment(Element.ALIGN_CENTER); 
   cell33.setHorizontalAlignment(Element.ALIGN_CENTER);
   cell33.setVerticalAlignment(Element.ALIGN_CENTER); 
   table.addCell(cell11);
   table.addCell(cell22);
   table.addCell(cell33);  
  }
  document.add(table);  
  document.close();
  } catch (Exception e) {
  System.out.println("file create exception");
  }
  
 }

以下是合并多个pdf文件功能程序,上代码:

//*********合并 pdfFilenames为文件路径数组,targetFileName为目标pdf路径
 public static void combinPdf(String[] pdfFilenames, String targetFilename) 
 throws Exception { 
 PdfReader reader = null; 
 Document doc = new Document(); 
 PdfCopy pdfCopy = new PdfCopy(doc, new FileOutputStream(targetFilename)); 
 int pageCount = 0; 
 doc.open(); 
 for (int i = 0; i < pdfFilenames.length; ++i) { 
 System.out.println(pdfFilenames[i]);
 reader = new PdfReader(pdfFilenames[i]); 
 pageCount = reader.getNumberOfPages(); 
 for (int j = 1; j <= pageCount; ++j) { 
 pdfCopy.addPage(pdfCopy.getImportedPage(reader, j)); 
 } 
 } 
 doc.close(); 
 }

这里附上测试程序:

public static void main(String[] args) throws InterruptedException {
 String fillTemplate1 = "E:/测试.pdf";
 String fillTemplate2 = "E:/测试.pdf";
 String[] st = {fillTemplate1,fillTemplate2};
 try {
 combinPdf(st,"E:/合并.pdf");
 
 } catch (Exception e) {
 e.printStackTrace();
 }
 
 }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易盾网络。如有错误或未考虑完全的地方,望不吝赐教。

网友评论