Я создаю PDF-файл с несколькими простыми таблицами. Каждая таблица содержит 1-2 ячейки: ячейка изображения, и большинство таблиц также содержат текстовую ячейку.
Он хорошо работает для всех 10 изображений, кроме одного: изображение не отображается.
Теперь я взял размеры ячеек таблицы этого изображения и построил небольшой пример (без изображений и текста, только одна таблица с двумя ячейками) для отладки кода:
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"
)




Ошибка действительно выглядит очень странно, но, к счастью, она уже исправлена в версии для 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"
Мне действительно любопытно, как подобные эффекты могут быть такими настойчивыми, поэтому я быстро взглянул на журнал изменений выпуска (кстати, этот журнал изменений показывает мне, насколько продвинулся проект itext7): github.com/itext/itext7/releases. Но я не мог заметить соответствующего изменения. Можете ли вы подтолкнуть меня в правильном направлении?
@ideaboxer, пожалуйста, не ждите, что абсолютно все исправленные ошибки будут перечислены в журнале изменений :)
Хорошо :-) Тем не менее мне интересно. Поскольку в настоящее время я использую библиотеку для некоммерческих проектов, мне интересно узнать исходный код, чтобы рано или поздно вернуть некоторую поддержку в виде запросов на вытягивание. Я рассматриваю этот вопрос как отличную отправную точку для внесения вклада.
Большое спасибо. Теперь это работает. Прежде чем я попробовал таблицы, я пробовал
Divs,Paragraphs и плавающие изображения для размещения содержимого страницы. Я мог добиться того же результата, что и сейчас, но другое изображение внезапно исчезло, когда оно было под определенным углом.