`

iText表格 分页

 
阅读更多

前言

在上一节中,通过listing 4.16产生的表格拥有一个头,表头中显示的为日期。如果我们仔细观察此PDF的话你会发现基本上每一部电影的信息都会超过一页,表格中数据被分割的不错,但是表头却消失了。在这一节中我们会fix这个问题,而且还会为表格添加footer。

Repeating headers and footers

好了直接上效果图:

HeaderFooter1

上图是具体一天的电影播放信息,日期显示在第一行,第二行包括一些列的描述信息: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中都是支持的,具体看下图:

SpliteTable

在上图的上部大家可以看到,当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 读书笔记。

分享到:
评论

相关推荐

    itextpdf 导出pdf 表格 自动分页中文 目录

    3. **PDF表格自动分页**: 在生成PDF文档时,如果一个表格太长以至于无法在一页内完全显示,iTextPDF可以自动将其分页。通过调整表格属性,如行高、列宽,以及设置分页策略,可以确保表格在每一页上都保持完整的结构...

    itextpdf+itext-asian+xmlworker 导出pdf 表格 自动分页中文 目录.rar

    总结来说,这个压缩包提供了使用iTextPDF、iText-Asian和XMLWorker库创建包含中文、表格、自动分页和目录的PDF文档的实例。通过理解和实践这些示例,开发者可以掌握如何在Java环境中高效地生成符合要求的PDF文件,...

    iText 页码、保持表头、页眉、页脚DEMO

    iText页码、页眉、页脚,itext 的复杂表格实现、保留表头、表尾、根据需求生成不同的iText表格

    Java 使用iText生成word文档,有表格,图片,文本有颜色

    在这个场景中,我们将探讨如何利用iText来生成包含表格、图片以及带有颜色的文本的Word文档。 首先,要使用iText生成Word文档,你需要在项目中引入iText的库。iText提供了一个名为iText-for-Office的模块,专门用于...

    Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)

    本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF文件。 iText7是一款功能丰富的PDF处理库,它支持创建、编辑、解析和展示PDF文档。在Java中,我们可以利用iText7轻松地生成具有复杂结构的...

    Itext利用模板生成PDF实例demo,导入即可使用,供前台下载,打印,预览等

    在PDF中插入表格时,特别是在数据量不确定的情况下,Itext需要处理的一个关键问题就是分页。如果表格过大,可能会跨页显示,这可能会影响到文档的美观和可读性。描述中提到的“表格数据循环次数不确定时,有可能造成...

    iText中文教程.pdf

    - **页面布局**:可以控制文档的布局,比如多栏布局、自动分页等。 - **水印添加**:可以方便地为文档添加水印。 - **表格操作**:支持创建复杂的表格,并对表格进行样式设置和数据填充。 - **表单处理**:允许在PDF...

    iText7 html转换为pdf生成页码、页眉、页脚DEMO

    itext7 html转换为pdf;iText7页码、页眉、页脚,itext 的复杂表格实现;完整springboot项目代码

    iText-html转pdf

    iText不仅支持基本的PDF创建,还提供了高级功能,如表格、图像、超链接和自定义字体等的处理。在这个过程中,xmlworker是iText的一个扩展模块,它允许iText解析HTML和CSS,并将其转换为PDF。 首先,我们需要了解...

    itext加载velocity生成PDF

    `iText`库提供了一系列API,用于创建PDF文档、添加文字、图像、表格等元素。它支持流式和模型两种模式,前者适用于生成内容不确定或长度未知的情况,后者则适用于内容固定或已知的情况。在SpringMVC中,可以通过控制...

    利用itext操作pdf从数据库导出大量数据

    “testpdf”可能是用于测试生成的PDF文件,而“pfd大量数据的表格及水印.docx”可能是详细的操作步骤或结果展示,包含了如何使用iText处理大量数据和添加水印的具体步骤。 通过以上步骤,我们可以高效地利用iText...

    利用Itext实现html转pdf

    此外,对于大型的HTML文档,可能还需要考虑性能优化,如分页、表格处理、图像质量调整等。 总之,利用Itext实现HTML到PDF的转换涉及到多个步骤,包括HTML预处理、转换中间格式以及最后的PDF生成。在处理换行时,...

    iText5.0.4

    iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。该版本修复了一些重要的bug,新增了一些涉及图片的功能,同时 C# 版本的 iTextSharp 也做了相应...

    itextpdf.7z

    当表格内容超出一页时,ItextPDF会自动将内容分页,保持表格的完整性。 四、实例应用 在实际项目中,ItextPDF常用于生成报告、发票、合同等文档。例如,我们可以创建一个XML模板,包含预设的表单字段,然后读取...

    利用itext操作pdf从数据库导出大量数据--功能汇总(一)

    对于大数据量,可能需要考虑分页,iText提供了一些方法来控制页面断点。 此外,考虑到性能优化,当处理大量数据时,不建议一次性加载所有数据到内存中。可以采用迭代方式,每次只处理一部分数据,然后将这部分数据...

    itext导出大数据量pdf

    3. **数据布局**:对于复杂的数据结构,如大型表格,iText提供了Table类,可以创建多行多列的表格,并支持自定义样式。可以设置单元格合并、边框、对齐方式等,使数据呈现更加清晰。 4. **文本和图片处理**:iText...

    itext-2.1.7.js4.7z_javareport_V2_

    3. **表格创建**:提供了一套完整的API来创建和操作表格,包括合并单元格、调整列宽等。 4. **样式与模板**:可以定义CSS样式,实现类似网页布局的效果,也可以使用模板快速生成复杂的PDF文档。 5. **表单处理**:...

    iText in Action 2nd Edition Oct.2010

    - 表格与列表:详细介绍如何在PDF文档中插入表格、列表,并对其进行格式化。 - 图像与图形:包括如何插入各种类型的图像(如JPEG、PNG),以及绘制基本的几何图形。 - 超链接与注释:如何添加超链接、书签、注释...

    eXtremeTable分页控件完整例子(数据分页+数据导出)

    2. **PDF导出**:通过iText库,eXtremeTable支持将表格内容转换为PDF文档。PDF格式适合打印和跨平台分享,保持了原始布局和样式,便于阅读和存档。 3. **文本文件导出**:最简单的导出格式,eXtremeTable可以将表格...

Global site tag (gtag.js) - Google Analytics