【问题标题】:iText 7: Seemingly unpredictable behavior of tableiText 7:表的看似不可预测的行为
【发布时间】:2018-10-05 06:59:37
【问题描述】:

我正在创建一个带有几个简单表格的 PDF。每个表格包含 1-2 个单元格:一个图像单元格,大多数表格还包含一个文本单元格。

它适用于所有 10 张图像,但其中一张除外:图像未渲染。

现在我获取了该图像表格单元格的尺寸并构建了一个小示例(没有图像和文本,只有一个带有 2 个单元格的表格)来调试代码:

import com.itextpdf.kernel.colors.DeviceRgb
import com.itextpdf.kernel.geom.PageSize
import com.itextpdf.kernel.pdf.{PdfDocument, PdfWriter}
import com.itextpdf.layout.Document
import com.itextpdf.layout.borders.Border
import com.itextpdf.layout.element.{Cell, Table}

object PdfTablePdf extends App {
  val pdfWriter: PdfWriter = new PdfWriter("/tmp/table.pdf")
  val pdfDocument: PdfDocument = new PdfDocument(pdfWriter)

  val document = new Document(pdfDocument, new PageSize(2000, 3000))

  val table = new Table(1)

  val cellA = new Cell()
    .setMargin(0)
    .setPadding(0)
    .setBorder(Border.NO_BORDER)
  cellA.setBackgroundColor(new DeviceRgb(0, 255, 0))
  cellA.setWidth(1331.1774900609144f)
  cellA.setHeight(49.71372725227489f)
    // replace that value by 49f or 50f and the pdf will be rendered as expected

  table.addCell(cellA)

  val cellB = new Cell()
    .setMargin(0)
    .setPadding(0)
    .setBorder(Border.NO_BORDER)
  cellB.setBackgroundColor(new DeviceRgb(0, 0, 255))
  cellB.setWidth(1331.1774900609144f)
  cellB.setHeight(994.2745450454978f)
  table.addCell(cellB)

  document.add(table)

  document.close()

}

虽然它看起来无害,但它仍然表现出一些奇怪的行为:如果我将第一个单元格的高度设置为计算值 49.71372725227489f,则第二个单元格不会呈现在第一页上。

如果我将第一个单元格的高度设置为 49 或 50,则输出符合预期(第二个单元格直接位于第一个单元格下方)。

我不相信自己的眼睛,但它的表现确实如此。而且我确保它不是某个 PDF 查看器中的错误。

如何解释这种行为以及如何确保表格正确呈现?

build.sbt中的依赖:

name := "pdftablepdf"

version := "0.1"

scalaVersion := "2.12.4"

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-library" % scalaVersion.value,
  "org.scala-lang" % "scala-reflect" % scalaVersion.value,
  "org.scalactic" %% "scalactic" % "3.0.5",
  "org.scalatest" %% "scalatest" % "3.0.5" % "test",
  "com.itextpdf" % "kernel" % "7.1.1",
  "com.itextpdf" % "io" % "7.1.1",
  "com.itextpdf" % "layout" % "7.1.1",
  "com.itextpdf" % "forms" % "7.1.1",
  "ch.qos.logback" % "logback-classic" % "1.2.3"
)

【问题讨论】:

    标签: java scala itext pdf-generation itext7


    【解决方案1】:

    这个bug确实看起来很奇怪,但幸运的是它已经在7.1.2版本中得到修复。虽然尚未公开宣布也未上传到 Maven Central,但新版本的二进制文件已在 iText Artifactory 上提供。

    要在 Maven 中添加存储库,请使用以下配置:

      <repositories>
        <repository>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>itext-releases</id>
          <name>iText Repository - releases</name>
          <url>https://repo.itextsupport.com/releases</url>
        </repository>
      </repositories>
    

    要将其添加到 Scala 构建工具文件中,您可能需要以下命令:

    resolvers += "iText Releases" at "https://repo.itextsupport.com/releases"
    

    【讨论】:

    • 非常感谢。现在它起作用了。在尝试表格之前,我尝试过Divs、Paragraphs 和浮动图像来放置页面内容。我可以达到和现在一样的效果,但是在某个角度时,另一个图像突然消失了。
    • 我真的很好奇这样的效果怎么会如此持久,因此我快速查看了发布更改日志(顺便说一句,该更改日志显示了 itext7 项目取得了多少进展): github.com/itext/itext7/releases 。但我无法发现相关的变化。你能把我推向正确的方向吗?
    • @ideaboxer 请不要期望所有已修复的错误都会列在更改日志中 :)
    • 好的 :-) 我仍然很感兴趣。由于我目前正在将该库用于非商业项目,因此我有兴趣了解源代码,以便迟早以拉取请求的形式回馈一些支持。我认为这个问题是贡献的一个很好的切入点。
    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 2017-09-09
    • 2019-06-14
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多