java itext5 生成PDF并填充数据导出

java itext5 生成PDF并填充数据导出

主要功能有文本勾选框页眉页脚图片等功能。肯定没有专业软件画的好看,只是一点儿方法。仅供参考。

依赖

复制代码
        <!--pdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

文本勾选框

生成勾选框的图片,将图片插入到文本前面

复制代码
private static Image checkBoxPng;

	static {
		ClassPathResource classPathResource = new ClassPathResource(CHECK_BOX_PATH);
		try {
			byte[] byteArray = FileCopyUtils.copyToByteArray(classPathResource.getInputStream());
			checkBoxPng = Image.getInstance(byteArray);
		} catch (IOException | BadElementException e1) {
			e1.printStackTrace();
		}
	}

-------------------------------------------------------------------------

final Paragraph paragraph = new Paragraph();
		if (checkBox != null && checkBox) {
			try {
//				final Image png = Image.getInstance(CHECK_BOX_PATH);
				// y轴 向下偏移5 保证大致上都是水平的
				final Chunk chunk = new Chunk(checkBoxPng, 0, -5);
				paragraph.add(chunk);
			} catch (Exception e) {
				throw new BusinessException(e.getMessage());
			}
		}
		paragraph.add(new Phrase(value, font));

页眉页脚

itext5没有页眉页脚设置的api,所以用的是定位 的方式;

new Document();时预留出页眉和页脚数据所需要的空间大小

pdfPTable.writeSelectedRows(); 定位的方式把表格定位到对应的位置上即可

复制代码
@Slf4j
@Component
public abstract class HeaderFooterEventHelper extends PdfPageEventHelper {
	/**
	 * 页眉
	 */
	protected final List<CustomExportTemplateModuleDTO> headerList;
	/**
	 * 页脚
	 */
	protected final List<CustomExportTemplateModuleDTO> footerList;


	public HeaderFooterEventHelper(List<CustomExportTemplateModuleDTO> headerList,
	                               List<CustomExportTemplateModuleDTO> footerList) {
		this.headerList = headerList;
		this.footerList = footerList;
	}

	/**
	 * 一页加载完成触发,写入页眉和页脚
	 */
	@Override
	public abstract void onEndPage(PdfWriter writer, Document document);
}

		//移除边距 方便设置页眉和页脚  定制页眉页脚
		Document document = new Document(PageSize.A4,
				-30 + ObjectUtils.defaultIfNull(module.getLeftMargin(), 0),
				-30 + ObjectUtils.defaultIfNull(module.getRightMargin(), 0),
				// 页眉高度 + 间隙高度  /页脚高度 - 间隙高度 (页面底部有一部分真空区域)
				headerSize + GAP_SIZE + ObjectUtils.defaultIfNull(module.getUpMargin(), 0),
				footerSize + GAP_SIZE + ObjectUtils.defaultIfNull(module.getDownMargin(), 0));

		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		final PdfWriter writer = PdfWriter.getInstance(document, baos);
		// 初始化 页眉、页脚数据体
		writer.setPageEvent(new HeaderFooterEventHelper(headerDTOS, footerDTOS) {
			@Override
			public void onEndPage(PdfWriter writer, Document document) {
				final ICustomExportTemplateService customExportTemplateService = SpringContextUtil.getBean(ICustomExportTemplateService.class);
				if (customExportTemplateService != null) {
					customExportTemplateService.setPdfData(this.headerList, writer, ZERO);
					customExportTemplateService.setPdfData(this.footerList, writer, ONE);
				}
			}
		});

-------------------------------------------------------------------
@Override
	public void setPdfData(List<CustomExportTemplateModuleDTO> moduleDTOS, PdfWriter writer, Integer type) {
		float size = 0;
		final float sumSize = getSumSize(moduleDTOS);
		for (CustomExportTemplateModuleDTO item : moduleDTOS) {
			PdfPTable pdfPTable; // 创建的表格
			pdfPTable.setTotalWidth(PageSize.A4.getWidth());
			pdfPTable.setWidthPercentage(WIDTH_PERCENT);
			if (Objects.equals(type, ZERO)) {
				// 页眉 基点为 左下角0点 高度为 A4全高 - 使用高度
				pdfPTable.writeSelectedRows(0, -1, ZERO,
						PageSize.A4.getHeight() - size, writer.getDirectContent());
			} else if (Objects.equals(type, ONE)) {
				// 页脚 基点为 左下角0点 高度为 列表使用总高度 - 使用高度
				pdfPTable.writeSelectedRows(0, -1, ZERO,
						sumSize - size, writer.getDirectContent());
			}
			if (item.getLabel().equals(2)) {
				size += BigDecimal.valueOf(item.getData().size())
						.multiply(BigDecimal.valueOf(CELL_SIZE)).intValue();
			} else {
				// 默认每行高度为 25
				size += CELL_SIZE;
			}
		}
	}

图片

复制代码
PdfPCell cell = new PdfPCell();
// 我这里是根据文件服务器上的图片链接进行获取的。
cell.setImage(Image.getInstance(MinioUtil.getUrlName(imageUrl)));

实际图

相关推荐
Lumbrologist9 分钟前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
码不停蹄的玄黓15 分钟前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的18 分钟前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪21 分钟前
Java并发编程:Executors框架类深度解析
java·开发语言·并发
南极企鹅29 分钟前
深入理解 MVCC:数据库并发控制的基石
java·数据库·mysql
凯瑟琳.奥古斯特1 小时前
力扣1235:加权区间调度最优解
java·python·算法·leetcode·职场和发展
_童年的回忆_1 小时前
【php】在linux下PHP安装amqp扩展
linux·开发语言·php
想不到ID了1 小时前
第八篇: 登录注册功能实现
java·javascript
这是个假程序员1 小时前
PDF分色、智能PDF黑彩识别工具
pdf
AIMath~1 小时前
python中的uv命令揭秘
开发语言·python·uv