我正在使用iText pdf库, iText版本是2.1.7(com.lowagie)来生成pdf。在生成pdf文档时,第一页的最后一行出现在下一页的第一行。我在下面提供图片以供参考。在我的pdf生成中,在某些地方我使用表来显示数据,在某些地方,我使用Paragraph进行文本渲染。我还想通知文本将是html类型的文本,其中将有许多超链接。
关于如何解决,请帮助我。
图片如下。
答案 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();
要发生此错误,必须满足两个条件:
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);
}