java 生成 pdf 标题 表格 注释 合并
在项目中遇到的需求,要求生成动态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垂直方向) 是否支持pdfBaseFont 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);//列//总: 800table.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();//mergeColAndRowcell99 = 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
java 生成 pdf 标题 表格 注释 合并相关推荐
- Java生成PDF文档(表格)
Java生成PDF文档(表格) package org.jeecg.modules.esi.utils;import com.itextpdf.text.*; import com.itextpdf. ...
- java生成PDF(图片,模板,表格)
刚接到了一个需求,生成一个pdf,一开始以为挺简单的,通过模板生成嘛,我也发过相应的文章,根据模板直接生成pdf,响应到前端或者根据模板生成pdf,直接指定下载位置,这两种方案都可以,不过这篇文章主要 ...
- java生成PDF 导出
tip:生成pdf导出 需要的JAR包链接:https://www.hebaocun.com/asset/search/JAVA生成PDF需要的JAR包/ 原文链接:https://www.hebao ...
- Java生成PDF文件,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...
- Java生成PDF文件_自用
Java生成PDF文件 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 ...
- java生成PDF的几种方法
问题场景 总结一下用java生成PDF的方法: A.itext-PdfStamper pdfStamper(俗称抠模板) B.itext-Document document(正常代码撰写) C.wkh ...
- 使用java生成PDF并保存到本地服务器中
使用java生成PDF并保存到本地服务器中 1.导入maven <!-- PDF工具包 --><dependency><groupId>com.itextpdf&l ...
- java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...
- java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板
最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...
- JAVA操作pdf——创建表格
JAVA操作pdf--创建表格 一.前言 在实习的时候遇到了需要将查询到的数据构建成为PDF的情况,于是在网上查找到了相关的Java操作pdf的教程,看到大部分的文章都是使用ITextPdf操作的,于 ...
最新文章
- 中石油《计算机应用基础》,中石油华东《计算机应用基础》2018年秋学期在线作业(一).doc...
- 基础知识漫谈(1): 想到哪儿写到哪儿
- 截取屏幕指定区域保存为BMP文件
- Python 缓冲区
- SDK目录结构和adb工具及命令介绍
- Java:使用SingletonStream获得性能
- 解码(六):sws_scale像素格式转换代码演示
- 吴恩达深度学习5.3练习_Sequence Models_Neural machine translation with attention
- python弱类型好处_JavaScript弱类型语言的优缺点有哪些
- 用 Go 构建一个区块链 -- Part 1: 基本原型
- 系统架构师学习笔记_第六章(下)_连载
- 计算机组成原理:P5-存储器(下)
- 《广义动量定理与系统思考----战争…
- 小米路由器R4 TTL刷不死Bread第三方固件写入升级
- springboot redis: xxx as a subtype of [simple type, class java.lang.Object]: no such class found
- 【JAVASE】缓冲流,转换流,序列化流,打印流
- java applet介绍,Java中的Applet介绍
- 如何安装Eclipse WTP插件
- 基于VUE和Node.js的医院挂号预约管理系统
- 从南沙图书馆到故宫博物院,隐藏着怎样的未来世界?
热门文章
- matlab的otdr仿真,OTDR仿真分析软件
- Arduino无法下载,重刷Bootloader后解决问题
- 定时任务cron表达式
- 基于vivoY97的Adb驱动程序的安装
- synchronize偏向锁底层实现原理
- 《社会调查数据管理——基于Stata 14管理CGSS数据》一3.4 Stata的一些术语及使用通则...
- cmd /c和cmd /k 以及CMD命令
- 如何解决VC 应用程序无法启动,因为应用程序的并行配置不正确 sxstrace.exe问题...
- vue生产环境使用localhost请求端口号不是自己设置的?来试试这个
- 转行学IT:零基础学什么技术好?