在iText

时间:2017-02-10 06:44:26

标签: java itext

我正在使用iText pdf库, iText版本是2.1.7(com.lowagie)来生成pdf。在生成pdf文档时,第一页的最后一行出现在下一页的第一行。我在下面提供图片以供参考。在我的pdf生成中,在某些地方我使用表来显示数据,在某些地方,我使用Paragraph进行文本渲染。我还想通知文本将是html类型的文本,其中将有许多超链接。

关于如何解决,请帮助我。

图片如下。

Duplicate line in next page

1 个答案:

答案 0 :(得分:0)

我调查并隔离了该问题。下面是重现它的代码(代码在C#中,但我认为它在库的Java版本中工作相同)。在答案的最后,我提供了一种解决方法。

var document = new Document(PageSize.A4, 20, 20, 50 /* must be bigger or equal than height of row for bug to occur */, 20);
var pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();
document.NewPage();
var table = new PdfPTable(1) { SplitLate = false };

for (var i = 0; i < 100; i++)
{
    var cell = new PdfPCell();
    cell.AddElement(new Phrase("Header " + i));

    var innerTable = new PdfPTable(1);
    for (var j = 0; j < 10; j++)
    {
        innerTable.AddCell(new PdfPCell(new Phrase("Inner cell " + (i*10+j))) { MinimumHeight = 25 });
    }
    cell.AddElement(innerTable);
    table.AddCell(cell);
}

document.Add(table);
pdfWriter.CloseStream = false;
document.Close();

要发生此错误,必须满足两个条件:

  1. 上边距必须大于或等于行高
  2. 外部表的单元格中必须有一个Phrase(实际上可能是任何非表元素)

结果是: bug on pagebreak

这可能是由于代码检查中是否存在一行空间(特别是在其中处理边距)中的错误所致。

进一步调查后发现,如果将元素包装在虚拟表中,则不会发生此问题:

for (var i = 0; i < 100; i++)
{
    var cell = new PdfPCell();
    var wrapperTable = new PdfPTable(1) { WidthPercentage = 100 };
    wrapperTable.DefaultCell.Border = Rectangle.NO_BORDER;
    wrapperTable.AddCell(new Phrase("Header " + i));
    cell.AddElement(wrapperTable);

    var innerTable = new PdfPTable(1);
    for (var j = 0; j < 10; j++)
    {
        innerTable.AddCell(new PdfPCell(new Phrase("Inner cell " + (i*10+j))) { MinimumHeight = 25 });
    }
    cell.AddElement(innerTable);
    table.AddCell(cell);
}

导致: fixed pagebreak