前言
在上一节中,通过listing 4.16产生的表格拥有一个头,表头中显示的为日期。如果我们仔细观察此PDF的话你会发现基本上每一部电影的信息都会超过一页,表格中数据被分割的不错,但是表头却消失了。在这一节中我们会fix这个问题,而且还会为表格添加footer。
Repeating headers and footers
好了直接上效果图:
上图是具体一天的电影播放信息,日期显示在第一行,第二行包括一些列的描述信息:Location,Time,Run Length等,同样的信息还被加入到footer中。为了实现上图的效果我们需要添加三列:背景为黑色且有日期的一列,背景为灰色的二列(一列添加到header,一列添加到footer)。具体参考以下代码:
listing 4.18 HeaderFooter1.cs
PdfPCell cell = new PdfPCell(new Phrase(day.ToString("yyyy-MM-dd"), f)); cell.BackgroundColor = BaseColor.BLACK; cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.Colspan = 7; table.AddCell(cell); // Add the second header row twice table.DefaultCell.BackgroundColor = BaseColor.LIGHT_GRAY; for (int i = 0; i < 2; i++) { table.AddCell("Location"); table.AddCell("Time"); table.AddCell("Run Length"); table.AddCell("Title"); table.AddCell("Year"); table.AddCell("Directors"); table.AddCell("Countries"); } table.DefaultCell.BackgroundColor = null; // There are three special rows table.HeaderRows = 3; // One of them is a footer table.FooterRows = 1;
以上代码看起来有点奇怪:我们在还没有添加内容时就将footer添加进去了。不过这是iText内部设置的:首先通过HeaderRows属性告诉iText有三个特殊的列,然后通过FooterRows属性说明其中一个为footer列。这样前两列就被先添加进去,然后是具体的内容,但需要新的一页或者没有数据时,第三列也就是footer列就会被添加。表格跨页显示时表头也会被重复,footer也会在表格的末端重复,但如果设置SkipLastFooter为true就footer列就不会被添加。重复的footer列有一个好处就是可以提示我们:表格会在下一页继续显示。和SkipLastFooter属性对应的为SkipFirstHeader,将其设置为true也可以提示我们:表格在前一样也有数据。
Splitting tables
当表格中的一列不能在一页中完全填充时就有两个选择:在新的一页开始这一列或者尽可能多在当前页中的列中添加数据,然后将剩下的数据添加到下一页中。这两种方式在iText中都是支持的,具体看下图:
在上图的上部大家可以看到,当Terminator2这一列不能在前一页完全填充时,这一列就会在下一页中被完全添加,这也是默认的行为。在图的下部Termianator2的数据被分布在两页中,具体的实现代码很简单:
listing 4.19 HeaderFooter2.cs
PdfPTable table = GetTable(conn, day); table.SplitLate = true; document.Add(table);
Memory management for LargeElement implementations
在第二节我们学习实现了ILargElement的Chapter和Section对象,这一节中PdfPTable也实现了此接口。这些对象会在被添加到文档之前,我们一般会往其添加大量的内容,相应也会消耗大量内存。一般当我们将一些对象添加到Document时,这些对象就可以被GC回收,但类似PdfPTable和Chapter对象我们只能在完成之后才能将其添加到Document中。因此我们希望有一个完善的解决方案:在这些对象没有被添加到Document之前我们可以将部分内容写入到PdfWriter和相应的输出流中以便减少内存消耗,而且我们希望这个过程没有副作用(side effects),不会影响到PdfPTable的header,footer以及Chapter对象的标题,缩进等。ILargeElement就是为了解决这个问题而创建的。以下为ILargeElement接口:
public interface ILargeElement : IElement { /** * If you invoke setCompleted(false), you indicate that the content * of the object isn't complete yet; it can be added to the document * partially, but more will follow. If you invoke setCompleted(true), * you indicate that you won't add any more data to the object. * @since iText 2.0.8 * @param complete false if you'll be adding more data after * adding the object to the document. */ bool ElementComplete { get; set; } /** * Flushes the content that has been added. */ void FlushContent(); }
其中FlushContent方法是有内部管理,我们只需要设置ElementComplete属性,具体代码如下:
listing 4.20 MemoryTests.cs
// Create a table with 2 columns PdfPTable table = new PdfPTable(new float[] {1, 7}); // Mark the table as not complete if(test) { table.ElementComplete = false; } … // add information about a movie foreach (var movie in movies) { ……// insert a checkpoint every 10 movies if(count ++%10==0 ) { // add the incomplete table to the document if(test) { document.Add(table); } } } // Mark the table as complete if(test) { table.ElementComplete = true; } // add the table to the document document.Add(table);
在以上代码中,实现设置表格的ElementComplete属性为false,然后就可以在表格还没有完全构建完毕之前将其添加到文档中,最后表格构建完毕时设置ElementComplete属性为true,最后再次添加到文档中即可。书中的列子还详细的写了使用ILargeElement接口和不使用的内存使用,这里我就没有写了,各位那个老鸟就帮忙写个。
总结
这一节主要是对大数据量表格的处理,如重复的header和footer,最后一列的处理方式,最后就是内存的使用。看起来比较复杂但iText已经封装的很好,写代码时只要设置几个属性即可。最后是代码下载。
同步
此文章已同步到目录索引:iText in Action 2nd 读书笔记。
相关推荐
3. **PDF表格自动分页**: 在生成PDF文档时,如果一个表格太长以至于无法在一页内完全显示,iTextPDF可以自动将其分页。通过调整表格属性,如行高、列宽,以及设置分页策略,可以确保表格在每一页上都保持完整的结构...
总结来说,这个压缩包提供了使用iTextPDF、iText-Asian和XMLWorker库创建包含中文、表格、自动分页和目录的PDF文档的实例。通过理解和实践这些示例,开发者可以掌握如何在Java环境中高效地生成符合要求的PDF文件,...
iText页码、页眉、页脚,itext 的复杂表格实现、保留表头、表尾、根据需求生成不同的iText表格
在这个场景中,我们将探讨如何利用iText来生成包含表格、图片以及带有颜色的文本的Word文档。 首先,要使用iText生成Word文档,你需要在项目中引入iText的库。iText提供了一个名为iText-for-Office的模块,专门用于...
本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF文件。 iText7是一款功能丰富的PDF处理库,它支持创建、编辑、解析和展示PDF文档。在Java中,我们可以利用iText7轻松地生成具有复杂结构的...
在PDF中插入表格时,特别是在数据量不确定的情况下,Itext需要处理的一个关键问题就是分页。如果表格过大,可能会跨页显示,这可能会影响到文档的美观和可读性。描述中提到的“表格数据循环次数不确定时,有可能造成...
- **页面布局**:可以控制文档的布局,比如多栏布局、自动分页等。 - **水印添加**:可以方便地为文档添加水印。 - **表格操作**:支持创建复杂的表格,并对表格进行样式设置和数据填充。 - **表单处理**:允许在PDF...
itext7 html转换为pdf;iText7页码、页眉、页脚,itext 的复杂表格实现;完整springboot项目代码
iText不仅支持基本的PDF创建,还提供了高级功能,如表格、图像、超链接和自定义字体等的处理。在这个过程中,xmlworker是iText的一个扩展模块,它允许iText解析HTML和CSS,并将其转换为PDF。 首先,我们需要了解...
`iText`库提供了一系列API,用于创建PDF文档、添加文字、图像、表格等元素。它支持流式和模型两种模式,前者适用于生成内容不确定或长度未知的情况,后者则适用于内容固定或已知的情况。在SpringMVC中,可以通过控制...
“testpdf”可能是用于测试生成的PDF文件,而“pfd大量数据的表格及水印.docx”可能是详细的操作步骤或结果展示,包含了如何使用iText处理大量数据和添加水印的具体步骤。 通过以上步骤,我们可以高效地利用iText...
此外,对于大型的HTML文档,可能还需要考虑性能优化,如分页、表格处理、图像质量调整等。 总之,利用Itext实现HTML到PDF的转换涉及到多个步骤,包括HTML预处理、转换中间格式以及最后的PDF生成。在处理换行时,...
iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。该版本修复了一些重要的bug,新增了一些涉及图片的功能,同时 C# 版本的 iTextSharp 也做了相应...
当表格内容超出一页时,ItextPDF会自动将内容分页,保持表格的完整性。 四、实例应用 在实际项目中,ItextPDF常用于生成报告、发票、合同等文档。例如,我们可以创建一个XML模板,包含预设的表单字段,然后读取...
对于大数据量,可能需要考虑分页,iText提供了一些方法来控制页面断点。 此外,考虑到性能优化,当处理大量数据时,不建议一次性加载所有数据到内存中。可以采用迭代方式,每次只处理一部分数据,然后将这部分数据...
3. **数据布局**:对于复杂的数据结构,如大型表格,iText提供了Table类,可以创建多行多列的表格,并支持自定义样式。可以设置单元格合并、边框、对齐方式等,使数据呈现更加清晰。 4. **文本和图片处理**:iText...
3. **表格创建**:提供了一套完整的API来创建和操作表格,包括合并单元格、调整列宽等。 4. **样式与模板**:可以定义CSS样式,实现类似网页布局的效果,也可以使用模板快速生成复杂的PDF文档。 5. **表单处理**:...
- 表格与列表:详细介绍如何在PDF文档中插入表格、列表,并对其进行格式化。 - 图像与图形:包括如何插入各种类型的图像(如JPEG、PNG),以及绘制基本的几何图形。 - 超链接与注释:如何添加超链接、书签、注释...
2. **PDF导出**:通过iText库,eXtremeTable支持将表格内容转换为PDF文档。PDF格式适合打印和跨平台分享,保持了原始布局和样式,便于阅读和存档。 3. **文本文件导出**:最简单的导出格式,eXtremeTable可以将表格...