iText中pdf文档下一页中的重复行

问题描述 投票:2回答:1

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

请在这方面帮助我解决地址问题。

下面给出图像。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9sOXlHUS5wbmcifQ==” alt =“下一页中的重复行”>

java itext
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.