java 生成 pdf 标题 表格 注释 合并

java 同时被 2 个专栏收录
3 篇文章 0 订阅
1 篇文章 0 订阅

在项目中遇到的需求,要求生成动态PDF表格文件,有标题 表格 注释 下面数步骤及代码,还没有完全完善,多行的合并,一直没有找到合适的方法去实现,如果有方法欢迎交流:

在eclipse 中的代码编写
分布式,后端代码的实现:
在maven 下导入依赖
导入依赖:

<dependency>
	 <groupId>com.itextpdf</groupId>
	 <artifactId>itextpdf</artifactId>
	 <version>5.5.10</version>
	</dependency>
	<!--输出中文,还要引入下面itext-asian.jar包 -->
<dependency>
		 <groupId>com.itextpdf</groupId>
		 <artifactId>itext-asian</artifactId>
		 <version>5.2.0</version> 
	</dependency>

一个 main方法 实现表格的生成:
package pdfTest;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

/**
*

  • Description :
  • Author:xiaokeai
  • Create Date: 2019年8月8日 下午2:30:57

*/

public class printPdfTest {

@SuppressWarnings("static-access")//抑制警告
public static void main(String[] args) throws Exception {
	 

	PdfUtil pdfutil=new PdfUtil();

	// 创建文本

// Document document = new Document(PageSize.A3, 50, 50, 50, 50);// 上下左右页边距
Document document = new Document(PageSize.A3, 70,70, 60, 60);
try {

		// 写入文本到文件中 文件生成地址:D盘 
		PdfWriter.getInstance(document, new FileOutputStream(
				"D:\\测试PDF.pdf"));
		//打开文本
		document.open();
		//字体类型 编码方式(horizontal H水平方向 vertical V垂直方向)  是否支持pdf
		BaseFont baseFont = BaseFont.createFont("C:\\Windows\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
		BaseFont baseFontHei = BaseFont.createFont("C:\\Windows\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
		// 标题
		
		Font font = new Font(baseFontHei,Font.BOLD,1);// 段落加粗的字体格式
		Font font2 = new Font(baseFontHei);// 字体  fax使用的字体格式
		
		Paragraph paragraph = new Paragraph(10);// 边距
		// 1 2 3 中右左
		paragraph.setAlignment(1); // 对齐方式
		font.setSize(15);// 字体大小 
		paragraph.setFont(font);// 设置段落字体
		Chunk chunk = new Chunk("测试PDF");
		paragraph.add(chunk);
		document.add(paragraph);
		
		
		Paragraph paragraph1 = new Paragraph(20);
		// 1 2 3 中右左
		paragraph1.setAlignment(1); // 对齐方式
		font.setSize(10);
		paragraph1.setFont(font);
		Chunk chunk1 = new Chunk("编号:");
		paragraph1.add(chunk1);
		document.add(paragraph1);

		Paragraph paragraph2 = new Paragraph(20);
		// 1 2 3 中右左
		paragraph2.setAlignment(3); // 对齐方式
		font2.setSize(10);
		paragraph2.setFont(font2);
		Chunk chunk2 = new Chunk("FAX: ");
		paragraph2.add(chunk2);
		paragraph2.setSpacingAfter(5);//设置后面的间距。
		document.add(paragraph2);
		
		
		Paragraph paragraph3 = new Paragraph(10);
		// 1 2 3 中右左
		paragraph3.setAlignment(3); // 对齐方式
		font.setSize(10);
		paragraph3.setFont(font); 
		Chunk chunk3= new Chunk("截止日期:"+"      年"+"  月"+"  日");
		paragraph3.add(chunk3);
		//paragraph3.setSpacingAfter(0);
		document.add(paragraph3);
		
		Paragraph paragraph4 = new Paragraph(10);
		// 1 2 3 中右左
		paragraph4.setAlignment(2); // 对齐方式 
		font.setSize(10);
		paragraph4.setFont(font);
		Chunk chunk4= new Chunk("单元: "+"  元");
		paragraph4.add(chunk4);
		paragraph4.setSpacingBefore(-12);//设置前面距离
		paragraph4.setSpacingAfter(4);//设置后面的间距。
		document.add(paragraph4);

		
		// 标题与表格中间的距离
		Paragraph p = new Paragraph(50);
		Font f = new Font(baseFont);// 字体
		f.setSize(18);// 字体大小
		p.setFont(f);// 设置段落字体
		Chunk c = new Chunk("");
		p.add(c);
		document.add(p);

		PdfPTable table = new PdfPTable(11);//列
		//总: 800
		table.setTotalWidth(800);//表格的宽度
		
		//20  20 112 82 74 68 76  77 66 79 47 
		float[] columnWidth5 = { 30, 30, 120, 60, 60, 60, 90, 70, 80, 50, 50 };//宽度
		table.setTotalWidth(columnWidth5);//列宽
		table.setLockedWidth(true);// 宽度算正确
		table.addCell(PdfUtil.drawPdfPCellHei("名称", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("序号", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("合同名称", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("合同编号", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("合同金额", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("订单编号", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("订单金额", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("已开票金额", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("已支付金额", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("已收账款金额", baseFontHei, 10, 1, 80));
		table.addCell(pdfutil.drawPdfPCellHei("核对结果(相符打√,不相符填写核对结果)", baseFontHei, 10, 1, 80));
		document.add(table);

        
		//第二列跨列跨行:
		PdfPCell cell99 = new PdfPCell();
						//mergeColAndRow
		cell99 = PdfUtil.mergeColAndRow("",font,1,100000000);

		table = new PdfPTable(11);
		table.setTotalWidth(800);
		 					  //30, 30, 120, 60, 60, 60, 90, 70, 80, 50, 50 
		float[] columnWidth6 = { 30,30, 120, 60, 60, 60, 90, 70, 80, 50, 50 };
		table.setTotalWidth(columnWidth6);
		table.setLockedWidth(true);// 宽度算正确
		table.addCell(cell99);
		
		for (int n = 0; n < 3; n++) {
			int number=n+1;
			String num=Integer.toString(number);
			//table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell(num, baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
			table.addCell(pdfutil.drawPdfPCell("", baseFontHei, 10, 1, 45));
		}
		document.add(table);
		
		//第三行
		table = new PdfPTable(9);
		table.setTotalWidth(800);
				   //30,30,120,60,60,60,90,70,80,50,50 
        float[] columnWidth4={0,240,60,60,90,70,80,50,50};
        table.setTotalWidth(columnWidth4);
        table.setLockedWidth(true);//宽度算正确
        table.addCell(pdfutil.drawPdfPCell("",baseFontHei,10,1,16));
        table.addCell(pdfutil.drawPdfPCellHei("合计",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("0.00",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("-",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("0.00",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("0.00",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("0.00",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("0.00",baseFontHei,10,1,20));
        table.addCell(pdfutil.drawPdfPCell("",baseFontHei,10,1,20));
        document.add(table);
        
        
        
        // 备注信息
        //方式一:
        // 段落间隔 内容名称 对齐方式
        Paragraph paragraph5 = PdfUtil.getParagraph(10,
          " \n备注:1、所载信息来源于供应商企业。请贵公司将整行核对结果在附表表格“右一栏”中加以确认。" + "\n\r"
            + "      2、本函仅为复核账目之用,并非催款结算。" + "\n\r"
            + "      3、本函中应收账款金额为合同已开发票金额减去已支付金额。", 3, 10, 5,0, font2);
        document.add(paragraph5);
        //国网信息
        Paragraph paragraph6 = PdfUtil.getParagraph(40,"国网 省电力有限公司物资分公司" + "\n" + "年  月  日", 2, 10, 5,0, font2);
        document.add(paragraph6);
        
       /*方式二:
        *  Paragraph paragraph5 = new Paragraph(10);
		// 1 2 3 中右左
		paragraph5.setAlignment(3); // 对齐方式
		Font font5 = new Font(baseFontHei);// 字体
		font5.setSize(10);
		paragraph5.setFont(font5);
		Chunk chunk5= new Chunk(" \n备注:1、所载信息来源于供应商企业。请贵公司将整行核对结果在附表表格“右一栏”中加以确认。"+"\n\r"+"      2、本函仅为复核账目之用,并非催款结算。"+"\n\r"+"      3、本函中应收账款金额为合同已开发票金额减去已支付金额。");
		paragraph5.add(chunk5);
		paragraph5.setSpacingAfter(5);
		document.add(paragraph5);
		
		Paragraph paragraph6 = new Paragraph(40);
		// 1 2 3 中右左
		paragraph6.setAlignment(2); // 对齐方式
		Font font6 = new Font(baseFontHei);// 字体
		font6.setSize(10);
		paragraph6.setFont(font6);
		Chunk chunk6= new Chunk("国网 省电力有限公司物资分公司"+"\n"+"年  月  日");
		paragraph6.add(chunk6);
		paragraph6.setSpacingAfter(5);
		document.add(paragraph6);*/
			
		// 关闭文本
		document.close();
	} catch (DocumentException e) {
		e.printStackTrace();
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}
	
}

}

下面是方法的工具类,没有合并 第二列 和 第三列, 第一行的方法

package pdfTest;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
/**
*

  • pdf工具类
  • @author Administrator

*/
@SuppressWarnings(“unused”)
public class PdfUtil {

/**
 * @param cellText
 *            格子的文字
 * @param baseFont
 *            字体类型 正常
 * @param size
 *            字体大小
 * @param alignment
 *            对齐方式
 * @return
 * @throws Exception
 *
 */
@SuppressWarnings("static-access")
public static PdfPCell drawPdfPCell(String cellText, BaseFont baseFont,
		float size, int alignment, int minimumHeight) throws Exception {
	// 为null会报错 防止报错
	if (cellText == null) {
		cellText = " ";
	}
	// 表格开始
	Paragraph paragraph = new Paragraph();
	paragraph.setAlignment(alignment); // 对齐方式
	Font font = new Font(baseFont);// 字体
	font.setSize(size);// 字体大小
	paragraph.setFont(font);// 设置段落字体
	Chunk chunk = new Chunk(cellText);
	paragraph.add(chunk);
	PdfPCell cell = new PdfPCell();
	cell.setUseAscender(true);
	cell.setVerticalAlignment(cell.ALIGN_MIDDLE);// 设置cell垂直居中
	cell.setMinimumHeight(minimumHeight);// 设置单元格最小高度,当前行最小高度
	cell.addElement(paragraph);
	return cell;
}
/**
 * 
 * @param cellText
 * @param baseFont  加粗字体
 * @param size
 * @param alignment
 * @param minimumHeight 高度
 * @return
 * @throws Exception
 */
@SuppressWarnings("static-access")
public static PdfPCell drawPdfPCellHei(String cellText, BaseFont baseFont,
		float size, int alignment, int minimumHeight) throws Exception {
	// 为null会报错 防止报错
	if (cellText == null) {
		cellText = " ";
	}
	// 表格开始
	Paragraph paragraph = new Paragraph();
	paragraph.setAlignment(alignment); // 对齐方式
	Font font = new Font(baseFont,Font.BOLD,1);// 字体
	font.setSize(size);// 字体大小
	paragraph.setFont(font);// 设置段落字体
	Chunk chunk = new Chunk(cellText);
	paragraph.add(chunk);
	PdfPCell cell = new PdfPCell();
	cell.setUseAscender(true);
	cell.setVerticalAlignment(cell.ALIGN_MIDDLE);// 设置cell垂直居中
	cell.setMinimumHeight(minimumHeight);// 设置单元格最小高度,当前行最小高度
	cell.addElement(paragraph);
	return cell;
}
/**
 * 
 * @param string
 * @param font
 * @param i
 * @param j
 * @return
 */

//同时合并列和行的静态函数
public static PdfPCell mergeColAndRow(String str, Font font, int i, int j) {
    PdfPCell cell = new PdfPCell(new Paragraph(str, font));
    cell.setMinimumHeight(25);//设置最小高度
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置水平对齐方式,居中对齐
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置垂直对齐方式,居中对齐
    //将该单元格所在行包括该单元格在内的i列单元格合并为一个单元格
    cell.setColspan(i);//合拼列
    cell.setRowspan(j);//跨行数
    return cell;
}

/**
 * 设置段落内格式内容
 * @param numPadding 编辑
 * @param pContent 块内文本
 * @param alignment 对齐方式
 * @param size 字体大小
 * @param j 
 * @param i 
 * @param font 字体类型
 */
public static Paragraph getParagraph(int numPadding,String pContent,int alignment,int size,int i, int j, Font font){
 Paragraph paragraph = new Paragraph(numPadding);// 边距
  // 1 2 3 中右左
  paragraph.setAlignment(alignment); // 对齐方式
  font.setSize(size);// 字体大小
  paragraph.setFont(font);// 设置段落字体
  Chunk chunk = new Chunk(pContent);
  paragraph.add(chunk);
  return paragraph;
}

}
如果有合适的合拼方式,欢迎交流,
目前完成的效果 标题和 表头 就不显示了
在这里插入图片描述

需要完成的是这样的效果
在这里插入图片描述
怎么样才能完这个合并的效果呢 ,求指导:可以先邮件联系: ykaifeng629@163.com

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值