itext 7: преобразование HTML в PDF не выполняется при использовании ландшафтного режима в некоторых случаях (включая ссылку на тестовое репо) - PullRequest
1 голос
/ 06 апреля 2020

Я создал небольшое репозиторий GitHub, который демонстрирует проблему:

См. https://github.com/abrighton/itext-bug.

Репо содержит сгенерированный файл HTML (TEST. html), что приводит к тому, что itext 7 выдает исключение при преобразовании в PDF в альбомном режиме:

Exception in thread "main" java.lang.UnsupportedOperationException
        at com.itextpdf.layout.renderer.AreaBreakRenderer.draw(AreaBreakRenderer.java:83)
        at com.itextpdf.layout.renderer.AbstractRenderer.drawChildren(AbstractRenderer.java:855)
    at com.itextpdf.layout.renderer.BlockRenderer.draw(BlockRenderer.java:580)
    at com.itextpdf.layout.renderer.AbstractRenderer.drawChildren(AbstractRenderer.java:855)
    at com.itextpdf.layout.renderer.BlockRenderer.draw(BlockRenderer.java:580)
    at com.itextpdf.layout.renderer.DocumentRenderer.flushSingleRenderer(DocumentRenderer.java:147)
    at com.itextpdf.layout.renderer.RootRenderer.processRenderer(RootRenderer.java:380)
    at com.itextpdf.layout.renderer.RootRenderer.shrinkCurrentAreaAndProcessRenderer(RootRenderer.java:369)
    at com.itextpdf.html2pdf.attach.impl.layout.HtmlDocumentRenderer.shrinkCurrentAreaAndProcessRenderer(HtmlDocumentRenderer.java:347)
    at com.itextpdf.layout.renderer.RootRenderer.addChild(RootRenderer.java:264)
    at com.itextpdf.html2pdf.attach.impl.layout.HtmlDocumentRenderer.processWaitingElement(HtmlDocumentRenderer.java:234)
    at com.itextpdf.html2pdf.attach.impl.layout.HtmlDocumentRenderer.close(HtmlDocumentRenderer.java:194)
    at com.itextpdf.layout.Document.close(Document.java:135)
    at com.itextpdf.html2pdf.HtmlConverter.convertToPdf(HtmlConverter.java:261)
    at com.itextpdf.html2pdf.HtmlConverter.convertToPdf(HtmlConverter.java:221)
    at ItextBug$.saveAsPdf(ItextBug.scala:15)
    at ItextBug$.delayedEndpoint$ItextBug$1(ItextBug.scala:23)
    at ItextBug$delayedInit$body.apply(ItextBug.scala:9)
    at scala.Function0.apply$mcV$sp(Function0.scala:39)
    at scala.Function0.apply$mcV$sp$(Function0.scala:39)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    at scala.App.$anonfun$main$1(App.scala:73)
    at scala.App.$anonfun$main$1$adapted(App.scala:73)
    at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:553)
    at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:551)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:921)
    at scala.App.main(App.scala:73)
    at scala.App.main$(App.scala:71)
    at ItextBug$.main(ItextBug.scala:9)
    at ItextBug.main(ItextBug.scala)

Вот код:

import java.io.{ByteArrayInputStream, FileOutputStream, OutputStream}
import java.nio.file.{Files, Paths}

import com.itextpdf.html2pdf.HtmlConverter
import com.itextpdf.kernel.geom.PageSize
import com.itextpdf.kernel.pdf.{PdfDocument, PdfWriter}

// Run this from the directory containing TEST.html
object ItextBug extends App {
  def saveAsPdf(out: OutputStream, html: String, orientation: String): Unit = {
    val pageSize = if (orientation == "landscape") PageSize.LETTER.rotate() else PageSize.LETTER
    val writer: PdfWriter = new PdfWriter(out)
    val document: PdfDocument = new PdfDocument(writer)
    document.setDefaultPageSize(pageSize)
    HtmlConverter.convertToPdf(new ByteArrayInputStream(html.getBytes()), document)
    out.close()
  }

  val html = new String(Files.readAllBytes(Paths.get("TEST.html")))
  val out = new FileOutputStream("TEST.pdf")

  // This version crashes
  saveAsPdf(out, html, "landscape")

  // This version works
//  saveAsPdf(out, html, "portrait")
}

Что-то не так с этим кодом?

Я видел, как это происходит только с некоторыми входными HTML файлами. Там может быть что-то странное, однако HTML прекрасно отображается в браузере. Браузеры не генерируют исключения для плохих HTML, и конвертер HTML в PDF, вероятно, тоже не должен этого делать, если предположить, что это проблема.

(Использует Scala -2.13.1, Java - 11)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...