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)));

实际图

相关推荐
哎呦没8 分钟前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程5 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk6 小时前
Go-性能调优实战案例
开发语言·后端·golang