当前位置: 首页 > news >正文

项目练习:使用itextpdf制作pdf报表

文章目录

    • 0、情况说明
    • 1、pom
    • 2、demo
    • 3、效果

0、情况说明

本来是用jasperreport软件来制作pdf模板的。
但是,它有点局限性。

它的循环部分是detail。
我的需求是,在最后一页,紧贴着detail表格增加一块文本框。

但是
我用新增一个detail+判断的话,会导致总页数发生变化,无法确定最后一页。
用column footer+条件判断的话,会导致,最后一页有文本框,前面的页面最低下都留了一个空白区。
用last page footer,可以实现最后一页出现文本框,但是,这个文本框和detail部分有空白区。

上面三种办法都无法完美实现效果。

所以,想着用Java编码方式,自定义报表部分。

1、pom

            <!-- pdf:start --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><!-- 支持中文 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

2、demo

package com.pzj.pdf_demo;import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import net.sf.jasperreports.engine.JRException;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.UUID;public class Test01 {public static void main(String[] args) throws FileNotFoundException, JRException {generatePDFDoc();}/***		固定行高	20* @param value 文本* @param font 字体* @param horizontalAlignment 水平样式 0-left, 1-center, 2-right* @param verticalAlignment 垂直样式  4-top, 5-middle, 6-bottom;* @param colspan 列合并* @param rowspan 行合并* @param borderSide 外边框*  0-默认*  1-隐藏上边框*  2-隐藏下边框*  3-隐藏上、下边框*  4-隐藏左边框*  5-隐藏左、上边框*  6-隐藏左、下边框*  7-隐藏左、上、下边框*  8-隐藏右边框*  9-隐藏右、上边框*  10-隐藏右、下边框*  11-隐藏右、上、下边框*  12-隐藏左、右边框*  13-隐藏上、左、右边框*  14-隐藏下、左、右边框*  15-隐藏全部* @return*/public static PdfPCell createCell(String value, Font font, int horizontalAlignment, int verticalAlignment,int colspan, int rowspan, int borderSide) {PdfPCell cell = new PdfPCell();cell.setPhrase(new Phrase(value, font));//存值cell.setHorizontalAlignment(horizontalAlignment);//水平居中if(verticalAlignment>0){cell.setUseAscender(true);//垂直居中}cell.setVerticalAlignment(verticalAlignment);//垂直居中if(colspan>0 ){cell.setColspan(colspan);}if(rowspan>0){cell.setRowspan(rowspan);}if(borderSide>0){cell.disableBorderSide(borderSide);}cell.setMinimumHeight(20);return cell;}public static PdfPCell createCell(String value, Font font, int horizontalAlignment, int verticalAlignment,int colspan, int rowspan, int borderSide,int minHeight) {PdfPCell cell = new PdfPCell();cell.setPhrase(new Phrase(value, font));//存值cell.setHorizontalAlignment(horizontalAlignment);//水平居中if(verticalAlignment>0){cell.setUseAscender(true);//垂直居中}cell.setVerticalAlignment(verticalAlignment);//垂直居中if(colspan>0 ){cell.setColspan(colspan);}if(rowspan>0){cell.setRowspan(rowspan);}if(borderSide>0){cell.disableBorderSide(borderSide);}if (minHeight > 0) {cell.setMinimumHeight(minHeight);}return cell;}public static void generatePDFDoc(){Document doc = new Document(PageSize.A4);//定义doctry {File file = new File("C:\\Users\\admin\\Desktop\\code\\test.pdf");//生成目标文件file.createNewFile();PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(file));
//			writer.setPageEvent(new Watermark("LeaSoft"));// 水印doc.open();//openBaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);//2. BaseFont.createFont("C:/WINDOWS/Fonts/simsun.ttc", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//3. BaseFont.createFont("/simsun.ttc", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);Font font = new Font(bf, 10, Font.NORMAL, BaseColor.BLACK);//字体//使用中文字体有三种方式//1.使用itext自带的字体集包//2.使用本地的 字体资源//  2.1 windows下,字体资源在目录 C:/WINDOWS/Fonts,注意 ttc后缀要 加 ',1'//  2.2 linux 未尝试,不过同理,找到字体资源的绝对路径即可//3.可以将 字体资源 放到项目 当中Paragraph paragraph = new Paragraph("中文测试", font);//段落paragraph.setAlignment(PdfPCell.ALIGN_CENTER);paragraph.setLeading(14f); //行间距//paragraph.setIndentationLeft(12); //设置左缩进//paragraph.setIndentationRight(12); //设置右缩进//paragraph.setFirstLineIndent(24); //设置首行缩进//paragraph.setSpacingBefore(5f); //设置段落上空白//paragraph.setSpacingAfter(10f); //设置段落下空白//itext中没有行和列的概念,只有单元格,因此在声明table时就要指定列数//然后按table.addCell(cell)顺序添加		指定每列宽度PdfPTable table = new PdfPTable(new float[] { 2f, 2f, 2f, 2f});table.setSpacingBefore(10);table.setSpacingAfter(10);//表头table.addCell(createCell("XXX", font, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE, 0,0,15));table.addCell(createCell("XXX", font, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE,3,0,15));table.addCell(createCell("XXX", font, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE,0,0,15));table.addCell(createCell("XXX", font, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE,0,0,15));table.addCell(createCell("XXX", font, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE,0,0,15));table.addCell(createCell("XXX", font, PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE,0,0,15));//动态表格for(int i = 0; i<50; i++){//一行4个单元格table.addCell(createCell("v", font, Element.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE,0,0,0));table.addCell(createCell("v", font, Element.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE,0,0,0));table.addCell(createCell("v", font, Element.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE,0,0,0));table.addCell(createCell("v", font, Element.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE,0,0,0));}table.addCell(createCell("表格备注内容", font, Element.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE,0,0,0,150));table.addCell(createCell("", font, Element.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE,3,0,0,150));doc.add(paragraph);doc.add(table);}catch (Exception e){e.printStackTrace();}finally {// 5.关闭文档if(doc!=null){doc.close();}}}}

3、效果

在这里插入图片描述
参考文档:Java利用itext实现生成导出PDF文件

http://www.lryc.cn/news/574521.html

相关文章:

  • 电商场景BI解决方案:用观远BI捕获电商大促增长先机
  • (3)ROS2:6-dof前馈+PD / 阻抗控制器
  • 常见网络知识,宽带、路由器
  • UAVAI-YOLO:无人机航拍图像的小目标检测模型
  • NLP基础1_word-embedding
  • 桥头守望者
  • iostat中的util原理
  • OpenCV CUDA模块设备层-----检查 CUDA 错误并输出调试信息内联函数checkCudaError()
  • 【STM32】JTAG / SWD 调试原理简析
  • IN子查询与JOIN的区别理解
  • 数据赋能(319)——安全与合规——数据安全可控
  • 烟花爆竹生产企业库房存储安全风险预警系统
  • 前端如何让用户回到上次阅读的位置?
  • 医学数据分析实战:冠心病发病因素可视化
  • vue3+echarts实现tab切换多个图表
  • 微信小程序节点相关总结
  • 服务器常见问题以及解决方案
  • 学习threejs,使用kokomi、gsap实现图片环效果
  • 【AI落地应用实战】Chaterm:重新定义终端操作的AI智能工具
  • mapbox基础,导出地图
  • 打表法从原理到实战详解
  • RabbitMQ + JMeter 深度集成指南:中间件性能优化全流程解析!
  • uniapp/Vue/微信小程序瀑布流,小红书瀑布流,豆瓣瀑布流,淘宝瀑布流布局
  • 微信小程序如何实现通过邮箱验证修改密码功能
  • ORACLE表空间扩容
  • jmeter接口测试
  • Github 2025-06-24Python开源项目日报 Top10
  • PyTorch topk() 用法详解:取最大值
  • Gym安装
  • 数据结构day2