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

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

  • 依赖
  • **文本勾选框**
  • **页眉**,**页脚**
  • **图片**
  • 实际图

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

依赖

        
        
            com.itextpdf
            itextpdf
            5.5.13
        
        
            com.itextpdf
            itext-asian
            5.2.0
        

文本勾选框

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

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 headerList;
	/**
	 * 页脚
	 */
	protected final List footerList;


	public HeaderFooterEventHelper(List headerList,
	                               List 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 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)));

实际图

java itext5 生成PDF并填充数据导出_第1张图片

你可能感兴趣的:(java,pdf,开发语言)