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

这里只放部分片段的代码

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();
 }

 }

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

(0)

相关推荐

  • Java8使用stream实现list中对象属性的合并(去重并求和)

    前言 需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为BillsNums,有id.nums.sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份. 例如说:("s1", 1, 1),("s1",2,3),("s2",4,4), 求和并去重的话,就是("s1", 3, 4),("s2",4,4) 对象与属性 class BillsNums { private

  • 如何实用Java实现合并、拆分PDF文档

    前言 处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分的方法. 工具:Free Spire.PDF for Java 2.0.0 (免费版) 注:2.0.0版本的比之前的1.1.0版本在功能上做了很大提升,支持所有收费版的功能,只是在文档页数上有一定限制,要求不超过10页,但是对于常规的不是很大的文件,这个类库就非常实用. jar文件导入: 方法

  • 详解Java8合并两个Map中元素的正确姿势

     1. 介绍 本入门教程将介绍Java8中如何合并两个map. 更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况. 2. 初始化 我们定义两个map实例 private static Map<String, Employee> map1 = new HashMap<>(); private static Map<String, Employee> map2 = new HashMap<>(); Employee类 public class

  • Java 合并多个MP4视频文件

    局限性 只支持MP4文件 经过尝试对于一些MP4文件分割不了 依赖 <!-- mp4文件操作jar --> <!-- https://mvnrepository.com/artifact/com.googlecode.mp4parser/isoparser --> <dependency> <groupId>com.googlecode.mp4parser</groupId> <artifactId>isoparser</art

  • Java利用AlphaComposite类合并图像

    package com.hdwang.test; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.

  • Java中EasyPoi导出复杂合并单元格的方法

    前言: 上星期做了一个Excel的单元格合并,用的是EasyPoi,我之前合并单元格都是原生的,第一次使用EasyPoi合并也不太熟悉,看着网上自己套用,使用后发现比原生的方便些,贡献一下,也给其他用到合并而且用的是EasyPoi的小伙伴节省下时间. 导出模板: 坐标: 版本号,自己来定,可以去官网查看:EasyPoi官网 <!-- easypoi 导入包 --> <dependency> <groupId>cn.afterturn</groupId> &l

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

    这里只放部分片段的代码 java中使用二维数组生成表格非常方便,但是每一维的数组都需要排好序,而且,在java中所谓的二维数组,三维数组等,其实都是多个一维数组组成的 /** * 添加子女教育规划表. * @param name 子女姓名 * @param educationItems 某个孩子的教育规划的二维数组,每列依次是:学程阶段.年数.费用支出(元)/年.年增长率 * @param spacing * @throws DocumentException * @throws IOExcep

  • Java导出Excel统计报表合并单元格的方法详解

    目录 前言 示例 注意事项 总结 前言 Apache POI是一种流行的API,允许程序员使用Java程序创建,修改和显示MS Office文件. 它是由Apache Software Foundation开发和分发的开源库,用于使用Java程序设计或修改Microsoft Office文件. 它包含将用户输入数据或文件解码为MS Office文档的类和方法. HSSF - 用于读取和写入MS-Excel文件的xls格式 示例 类似上面的需要合并表头的报表在日常的开发中也是经常遇到,这里总结下关

  • java实现对excel文件的处理合并单元格的操作

    一.依赖引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6.12</version> </dependency> 二.表格操作 1.读取xls文件 测试文件为: 代码: public void test() throws IOException, BiffEx

  • Java利用EasyExcel实现合并单元格

    目录 pom版本 1.自定义合并单元格 1.1 不合并单元格 1.2 合并单元格 1.3 写多个sheet 1.4 WriteTable pom版本 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency> 1.自定义合并单元格 在某些

  • java实现合并单元格的同时并导出excel示例

    介绍 POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI可以操作的文档格式有excel,word,powerpoint等,POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet. 跨第1行第1个到第2个单元格的操作为 sheet.addMergedRegion(new Region(0,(short)0,0,(short)1)); 跨第1行第1个到第2行第1个单元格的操作为 sheet.addMe

  • JSP中动态合并单元格的实例代码

    废话不多说了,具体代码如下所示: <span style="font-size:14px;"> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <table width="100%" border="0" cellspacing="0" cellpadding="0&q

  • 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法

    今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Excel中格式的设置,以及单元格的合并等等.下面就介绍下,使用NPOI类库操作Excel的方法. 1.首先我们先在内存中生成一个Excel文件,代码如下:   HSSFWorkbook book = new HSSFWorkbook();        ISheet sheet = book.CreateSheet("Sheet1"); 2.然后在新创建的sheet里面,创建我们的行和列,代码如下

  • 浅谈openpyxl库,遇到批量合并单元格的问题

    我就废话不多说了,大家还是直接看代码吧~ from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.styles import NamedStyle, Border, Side, Alignment # 创建一个工作薄 wb = Workbook() # 创建一个工作表(注意是一个属性) table = wb.active # excel创建的工作表名默认为sheet1,一下代码实现了给新创建的工

  • postgresql高级应用之合并单元格的思路详解

    1.写在前面✍ 继上一篇postgresql高级应用之行转列&汇总求和之后想更进一步做点儿复杂的(圖表暫且不論哈

随机推荐