700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java后端生成pdf模板合并单元格表格

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

时间:2024-03-29 02:53:57

相关推荐

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。