java - iText 7:表的看似不可预测的行为
问题描述
我正在创建一个带有几个简单表格的 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"
)
解决方案
这个错误确实看起来很奇怪,但幸运的是它已经在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"
推荐阅读
- node.js - 如何让 puppeteer 在 Google Cloud Run/Cloud Build 中工作?
- ruby-on-rails - CI 服务器上的记录 ID 似乎已更改
- azure-devops - 是否可以将 Azure DevOps 管道报告导入 Power BI?
- ruby - NetSuite 发票的实体没有 external_id 或类型集
- reactjs - React TypeError:无法读取生产中未定义的属性'forEach'
- java - 在 AWS lambda java 中使用 Thread.sleep 是个好主意吗
- c# - 如何在 MSTest c# dotnet 中使用 UnhandledExceptionEventHandler
- mql4 - MQL4 增加了 COG 的宽度
- google-chrome - 如何在我们的网络浏览器中通过 UDP 进行通信?
- javascript - document.addEventListener 有时无法工作