【问题标题】:Duplicate line coming in the next page of pdf document in iTextiText 中 pdf 文档的下一页出现重复行
【发布时间】:2017-02-10 06:44:26
【问题描述】:

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

请在这方面帮助我如何解决。

图片如下。

【问题讨论】:

  • 能否添加相应的代码?以minimal reproducible example 的形式;)
  • 此外,从 2009 年开始的 iText 版本不提供任何支持。自您使用的版本发布以来已过去近 8 年,我们修复了许多错误。我们现在是 iText 版本 7!如果您可以使用 iText 5.5.10 或 iText 7.0.1 重现该问题,我们可能会查看该问题,但由于您使用的是过时版本,因此您只能靠自己。
  • 此外,您可能需要等待即将发布的版本。在 iText 2.1.7 中,对 HTML 的支持很差。在 iText 5 中,我们有已经更好的 XML Worker(例如对 CSS 的支持),但它仍然有很多限制。当我们为 iText 7 重写 iText 时,我们想到了 XML Worker(例如支持继承样式),我们几乎完成了 XML Worker 的 iText 7 端口。换句话说:如果你再等一周左右,你可以为自己节省很多编码痛苦。
  • @Debadatta 我想我记得在 5.x.x iText 代码中有签入,根据他们的 cmets 修复了与您类似的问题。因此,您确实应该检查在更新到 iText 5.5.10 并适应差异后是否不再出现问题,特别是不同的包名称。
  • @Sambit 我现在与 iTextSharp 4.1.6.16 有同样的问题。你当时解决了这个问题吗?

标签: java itext


【解决方案1】:

我调查并隔离了这个问题。下面是重现它的代码(代码在 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(实际上可能是任何非表格元素)

结果是:

这可能是由于代码检查中是否存在一行空间的错误,特别是那里处理边距的错误。

经过进一步调查发现,如果我们将元素包装在 dummy table 中,则不会出现此问题:

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);
}

导致:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2012-02-06
    • 2015-12-02
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多