我正在使用iText pdf库,iText版本为2.1.7(com.lowagie)以生成pdf。生成pdf文档时,第一页的最后一行进入下一页的第一行。我在图片下方提供了参考。在pdf生成中,在某些地方,我使用表格来显示数据,在某些地方,我使用段落来呈现文本。我还想告知该文本将是html类型的文本,其中将有许多超链接。
请在这方面帮助我解决地址问题。
下面给出图像。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9sOXlHUS5wbmcifQ==” alt =“下一页中的重复行”>
我调查并隔离了问题。下面是重现它的代码(代码在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();
要满足此错误,必须满足两个条件:
Phrase
(实际上可能是任何非表元素)这可能是由于代码检查是否存在一行空间,尤其是在那里处理边距的错误所致。
经过进一步调查,结果发现,如果将元素包装在虚拟表中,则不会发生此问题:
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);
}