使用itext根据freemarks模版生成pdf,表格产生跨页问题解决方法

java根据模版动态生成pdf的文章点击打开链接

  使用XMLWorkerHelper.getInstance().parseXHtml();生成pdf。

如果直接根据ftl模版中的<table></table>填充数据,如果表格列大于第一列填充空白,整个表格会整体移到第二页。

整个表格列大于整页pdf空白,会直接不显示表格。主要看我<#list></list>循环的模版代码,就可以完全解决这个问题。

我的list中循环的是div+表格

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Content-Style-Type" content="text/css"/>
    <title></title>
    <style type="text/css">
        body {
            font-family: pingfang sc light;
        }
        
		
		
		
		th,td{
			border: 1px  #ccc;
			text-align: center;	
			word-wrap : break-word ;
			word-break:break-all;	
		}
		table{
			border-collapse: collapse;
			table-layout: fixed;
			
		}
		.firstLine{
			font-size:12px;
			height:25px;
		}
		.SecondLine{
			font-size:12px;
			height:25px;
		}
		.SecondLineOne{
			float: left;
			text-align: left;
			width: 40px;
			
		}
		.SecondLineTwo{
			float: left;
			text-align: left;
			width: 320px;
			
		}
		.SecondLineThree{
			width: 17px;
			float: left;
			
		
		}
		.SecondLineFour{
			float: left;
			text-align: left;
			width: 320px;
			
		}
		.vertical{
			
		}
    </style>
</head>
<body>
<!--第一页开始-->


<div class="center" style="width:697px;">
	<div>
		<div class="firstLine" >
			<div style
iText库中,当你试图将HTML内容通过Freemarker模板转换为PDF时,如果文本行溢出面,iText通常会处理换行和分。如果一行的内容无法在当前完全显示,它会调整已存在的列的高度以容纳部分内容,并在必要时开始新的一行或新一。不过,这个行为默认是由iText的`ColumnText`组件和`Table`类管理的,它们控制着表格和文本的布局。 为了实现这样的效果,你需要按照以下步骤操作: 1. **解析HTML并创建表头**:使用Freemarker解析HTML模板,创建一个` PdfPTable`,设置列宽和高度。 ```java PdfPTable table = new PdfPTable(numberOfColumns); table.setWidthPercentage(100); // 设置总宽度百分比 ``` 2. **遍历模板内容**:对于每一行数据,动态添加到`PdfPCell`中,并考虑是否需要。 ```java PdfPCell cell; for (List<Object> rowData : templateData) { for (int i = 0; i < rowData.size(); i++) { cell = new PdfPCell(new Phrase(rowData.get(i).toString())); if (cell.getLineHeight() + previousCell.getLineHeight() > columnMaxHeight) { // 判断是否超出高度 table.addCell(previousCell); // 添加到现有列 startNewRow(); // 开始新行 } cell.setColspan(columnWidths[i]); // 调整列宽 previousCell = cell; } } ``` 3. **处理新**:当一行结束后,检查是否达到表格的边界,如果是,则开始新的一行和新的面。 ```java private void startNewRow() { table.addCell(previousCell); // 将最后一列添加完整 if (table.getRows().size() == PdfPTable.MAX_ROWS) { // 如果超过最大行数 document.newPage(); // 创建新 table = new PdfPTable(numberOfColumns); // 重新初始化表格 } previousCell = null; } ``` 4. **合并和添加到文档**:最后将表格添加到`Document`中。 ```java document.add(table); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值