iText 7: Казалось бы, непредсказуемое поведение стола - PullRequest
0 голосов
/ 25 апреля 2018

Я создаю 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.71372725227489f

Если я установлю высоту первой ячейки на 49 или 50, выходной сигнал будет таким, как ожидалось (вторая ячейка находится непосредственно под первой ячейкой).

50f

Я не поверил своим глазам, но они действительно вели себя так. И я убедился, что это не ошибка в определенной программе просмотра 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"
)

1 Ответ

0 голосов
/ 26 апреля 2018

Ошибка действительно выглядит очень странно, но, к счастью, она уже исправлена ​​в версии 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"
...